一、final 关键字
final修饰属性、方法、类
package com.feifan.javaoop.day5;
public class FinalDemo{
String s = "abc";
final int num = 10;
final int count;
public FinalDemo(int count) {
this.count = count;
}
public void test(){
new String("a");
new FinalDemo(10);
new FinalDemo(20);
}
}
二、接口 (interface、 implement)
1、什么是接口?
- 顶层的功能定义 ,专注于功能设计,而不是实现,让其他类具体实现
- 与抽象类相似,但有区别,接口实现多继承的逻辑
- 用多态方法使用
1)生活中的接口----USB接口
-
USB接口本身没有实现任何功能 USB接口规定了数据传输的要求 USB接口可以被多种USB设备实现
只要有USB接口,就可以通过USB风扇,USB鼠标,U盘 具体实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dabXpqsb-1642950372831)(C:\Users\16431\AppData\Roaming\Typora\typora-user-images\image-20220123162439599.png)]
那怎么实现? 可以使用java接口来实现
2)面向接口编程
程序设计时:
- 关心实现类有何能力,而不关心实现细节
- 面向接口的约定而不考虑接口的具体实现
3)接口存在意义?
java中一个类只能有一个父类,所以接口可以实现多继承的逻辑
2、接口怎么用?
简单总结:
1)接口定义 ( interface )
[访问权限修饰符 ] interface 接口名称 [extends 其他接口名1,…其他接口名n]{
? //1、静态属性 public static final
? //2、抽象方法 public abstract
? 子类不能进行选择性地对所有抽象方法进行重写,要重写就得对所有抽象方法全部重写
? //3、静态方法 public static void
? //4、默认方法 public default void
? 子类可以选择是否对定义的默认方法重写
}
2)接口实现 ( implements )
3)接口使用实例—Animal CanCry() CanFly()
- ? **接口是功能上的定义,**比如CanCry () CanFly()
- ? 抽象类除了功能定义还有类的成员变量,比如Animal 类中除了抽象方法还有成员变量
1)接口定义格式
-
接口——interface声明
-
接口中静态属性——默认public static final ,就是静态常量 接口中定义的属性用大写字母定义,比如:public static final PI =3.14; -
接口中抽象方法——默认pubic abstract -
接口中静态方法——接口可直接调用 public static -
接口中默认方法——通过子类调用 public default public interface MyInterface{ //interface 关键字定义类 ? int num; //所有属性默认为 public static final 静态常量 ? public void foo(); // 抽象方法是:public abstract ? public static void test() { ? //jdk8之后添加静态方法,接口可直接调用 ? } ? public default void test1(){ ? //jdk8之后添加默认方法,通过子类调用 ? } }
package com.feifan.javaoop.day5;
public interface MyInterface{
int NUM = 10;
void eat();
void sleep();
public static void test1(){
System.out.println("test1是接口中的静态方法,"+"接口中的属性NUM="+NUM);
}
public default void test2(){
System.out.println("test2是接口中的默认方法,");
}
}
package com.feifan.javaoop.day5;
public class TestMyInterface {
public static void main(String[] args) {
System.out.println(MyInterface.NUM);
MyInterface.test1();
}
}
2)接口实现格式
-
类使用 implements关键字来实现接口
- implements:实现
- [访问权限修饰符] class 类名 implements 接口1 ,接口2 …{ }
- 结合继承: [访问权限修饰符] class 类名 extends 父类名 implements 接口1 ,接口2 …{ }
-
实现接口的 类命名 ,公认的写法后加 Impl
- MyInterfaceImpl 前面:接口名,后面:Impl 表示接口类的实现
3、接口特性?
- 接口是隐式抽象的 ,声明接口时不需要abstract
- 接口中的方法可以是抽象的、静态的、默认的
- 接口中属性默认 public static final
- 接口不是被类继承,而是被类实现
- 接口不能实例化对象,无构造方法
- 一个类可以实现多个接口
- 与继承关系相似,接口与实现类之间存在多态
- 一个接口能继承其他多个接口
- 当类实现接口时,类要实现接口中的抽象方法,否则,类必须声明为抽象类
4、接口实例----Animal CanCry() CanFly()
**接口是功能上的定义,**比如CanCry () CanFly()
**抽象类除了功能定义还有类的成员变量,**比如Animal 类中除了抽象方法还有成员变量
package com.feifan.javaoop.day5.InterfaceDemo;
public abstract class Animal{
private String name;
public Animal() {
}
public Animal(String name) {
this.name = name;
}
public abstract void eat();
public abstract void sleep();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.feifan.javaoop.day5.InterfaceDemo;
public interface CanCry {
void cry();
}
package com.feifan.javaoop.day5.InterfaceDemo;
public interface CanFly {
void fly();
}
package com.feifan.javaoop.day5.InterfaceDemo;
public class Bird extends Animal implements CanFly, CanCry {
@Override
public void eat() {
}
@Override
public void sleep() {
}
@Override
public void fly() {
}
@Override
public void cry() {
}
}
package com.feifan.javaoop.day5.InterfaceDemo;
public class Dog extends Animal {
@Override
public void eat() {
}
@Override
public void sleep() {
}
}
package com.feifan.javaoop.day5.InterfaceDemo;
public class Test {
public static void main(String[] args) {
Animal bird = new Bird();
CanFly b = new Bird();
CanCry c = new Bird();
}
}
3、抽象类和接口区别
-
想实例 ,抽象类Animal 中有抽象方法eat() , sleep() ,这些是动物共性 。 然后设计接口CanCry CanFly 是一些动物实例对象的功能 。 比如鸟能叫,鸟能飞,而狗能叫,但狗不能飞, Bird 类 implements CanCry CanFly , 那么新建一个Brid对象时,就可以使用多态,接口引用 指向 Brid对象,类似于继承中的多态,通过子类调用父类中的方法(向上转型、向下转型),就可以通过新建的 Brid对象 实现接口 。 -
**接口是功能上的定义,**比如CanCry () CanFly() -
? 抽象类除了功能定义还有类的成员变量,比如Animal 类中除了抽象方法还有成员变量
1)相同点:
- 都不能创建对象
- 都可以表示多态性 (座位父类)
2)不同点:
- 接口:
- 接口不能有构造方法
- 不能有成员变量,只能有静态属性
- 不能有成员方法,只能有静态方法,默认方法
- 抽象类
- 抽象类能有构造方法
- 能有成员变量
4、抽象类和接口的关系?
-
一个类只能继承一个父类 ---- 类和类 -
一个类可以实现多个接口 ---- 类和接口 -
一个接口可以继承多个接口 ----- 接口和接口
package com.feifan.javaoop.day5;
public class InterfaceA {
}
package com.feifan.javaoop.day5;
public class InterfaceB {
}
package com.feifan.javaoop.day5;
public class InterfaceC {
}
package com.feifan.javaoop.day5;
public interface MyInterface extends InterfaceB, InterfaceC{
}
package com.feifan.javaoop.day5;
public class MyInterfaceImpl extends Object implements MyInterface, InterfaceA{
@Override
public void eat() {
}
@Override
public void sleep() {
}
@Override
public void test2() {
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nELZC0Gj-1642950372834)(C:\Users\16431\AppData\Roaming\Typora\typora-user-images\image-20220123184643345.png)]
三、数组
1、什么是数组?
- 数组是一组数据类型相同的数据集合
- 数组是引用数据类型,即 数组是对象
- 数组创建时必须有指定长度,创建后长度不可变,空间中内存是连续的
- 数组可以存储基本数据类型,也可以存储引用数据类型
面试题:现有5MB大小内存空间,能否创建3MB大小的内存空间?
答案:不一定 , 5M空间中可能没有连续的3M, 数组必须是连续的内存空间
2、 数组的声明和创建
1)数组声明
- int [] m; //建议使用这种方式
- int n [];
2)数组创建
- int [] a = new int[5];
- int [] a1 = new int[]{1,2,3,4,5};
- int [] a3 = {1,2,3,4,5};
package com.ffyc.javaarray;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
int [] m;
int n [];
int [] a = new int[5];
long [] b = new long[5];
char [] c = new char[5];
boolean [] d = new boolean[5];
String [] s = new String[5];
System.out.println(a.length);
System.out.println(a);
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
System.out.println(Arrays.toString(c));
System.out.println(Arrays.toString(d));
System.out.println(Arrays.toString(s));
int [] a1 = new int[]{1,2,3,4,5};
System.out.println(a1);
System.out.println(Arrays.toString(a1));
int [] a3 = {1,2,3,4,5};
System.out.println(a3);
System.out.println(Arrays.toString(a3));
}
}
3、 数组的访问和迭代
1)数组元素的访问
- 数组名 [ index ] index 索引、下标
- 索引从0开始
- 索引最大值和数组长度差1
2)数组迭代
重复执行程序中的循环,直到满足某条件为止,亦称为迭代。
- 数组迭代 两种方式: for循环 、 增强for循环
for循环 和 增强for循环区别
- for 循环有下标 ,可以对数组内按数组下标访问
- 增强for循环 , 只能遍历出数组中的元素
package com.ffyc.javaarray;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;
public class Demo3 {
public static void main(String[] args) {
int [] c = {1,2,4,3,5};
System.out.println(c.length);
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
for(int t : c){
System.out.println(t);
}
}
}
4、数组排序
1)冒泡排序
比较两个相邻的元素,将值 大/小 的元素交换到右边
package com.ffyc.javaarray;
public class BubbleSortDemo {
public static void main(String[] args) {
int [] a = new int[]{1,4,3,5,6};
System.out.println("数组长度为:"+a.length);
System.out.println("排序前:");
for( int t : a ){
System.out.print(t+"\t");
}
System.out.println("\n"+"排序后:");
BubbleSortDemo bubbleSortDemo = new BubbleSortDemo();
bubbleSortDemo.BubbleSort1(a, a.length);
System.out.println("从小到大排序:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+"\t");
}
System.out.println("\n"+"从大到小排序:");
bubbleSortDemo.BubbleSort2(a, a.length);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+"\t");
}
}
public void BubbleSort1(int a[],int lenght){
for (int j = 0; j < lenght -1; j++) {
for (int i = 0; i < lenght -1; i++) {
if (a[i] > a[i+1]){
int temp = a[i+1];
a[i+1] = a[i];
a[i] = temp;
}
}
}
}
public void BubbleSort2(int a[],int lenght){
for (int j = 0; j < lenght -1; j++) {
for (int i = 0; i < lenght -1; i++) {
if (a[i] < a[i+1]){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
}
}
数组长度为:5 排序前: 1 4 3 5 6 排序后: 从小到大排序: 1 3 4 5 6 从大到小排序: 6 5 4 3 1
2)选择排序
思想是: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
package com.ffyc.javaarray;
public class SelectionSortDemo {
public static void main(String[] args) {
int [] a = {1,5,4,7,0,2,5};
System.out.println("数组长度为:"+a.length);
System.out.println("排序前:");
for(int temp : a){
System.out.print(temp+"\t");
}
System.out.println("\n从小到大排序:");
SelectionSortDemo selectionSortDemo = new SelectionSortDemo();
selectionSortDemo.SelectionSort1(a, a.length);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+"\t");
}
System.out.println("\n从大到小排序:");
selectionSortDemo.SelectionSort2(a, a.length);
for(int temp : a){
System.out.print(temp+"\t");
}
}
public void SelectionSort1(int [] a, int length) {
for (int i = 0; i < a.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[minIndex]) {
minIndex = j;
}
}
swap(a, i, minIndex);
}
}
public void SelectionSort2(int [] a, int length){
for (int i = 0; i < a.length - 1; i++) {
int maxIndex = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] > a[maxIndex]) {
maxIndex = j;
}
}
swap(a, i, maxIndex);
}
}
public void swap(int [] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
数组长度为:7 排序前: 1 5 4 7 0 2 5 从小到大排序: 0 1 2 4 5 5 7 从大到小排序: 7 5 5 4 2 1 0
|