1.final定义
(1)为什么出现,继承中,不想让子类修改自己的方法或者变量。
final是个修饰符,除了构造方法以外的地方,都可以修饰。
可以修饰类,类的成员,局部变量。
2.造函数为何不能用abstract, static, final修饰?
不同于方法,构造器不能是abstract, static, final的.
(1).构造器不是通过继承得到的,所以没有必要把它声明为final的。
(2).同理,一个抽象的构造器将永远不会被实现,所以它也不能声明为abstract的。
(3).构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。
3.final类的特点:
(1)final修饰类不可以被继承,但是可以继承其它类。比如String类。
(2)final修饰的方法可以被继承,但是不可以被覆盖。
(3)final修饰的变量被称为常量,这些常量只能赋值一次。
final int i = 20;
(4)final修饰的引用变量,保存的内存你地址,终身不变。
(5) final修饰成员变量的时候,保存的是手动赋的值,不是默认值。
eg.final int age = 1;//保存的是1,不是默认的0。
4.成员变量的赋值,有2中实现方式,一种是定义的时候,直接 =赋值
另一种采用构造方法赋值
class Person{
eg. final int age;
public Person(int age){this.age = age}
5. setXXX方法,创建对象之后的事情,不能为final修饰的成员赋值。
6. static 关键字
(1)理解:需要共享的数据用static。比如学生和学校,学生有自己的姓名,但是校名共享一个,校名可以用static修饰。
(2)被静态修饰的成员,可以被类名字直接调用。
7.静态中不能调用非静态。为什么?
静态内容是优先于对象存在,只能访问静态,不能使用this/super.
形象比喻:静态==先人,秦始皇 非静态==后人。 秦始皇不能访问到后人,但是后人,可以挖秦始皇的墓。
eg.public class Test{
String name;
int age;
public static void function(){
System.out.println(name+age);//报错,
}
}
8.static 静态的使用场景
(1)可以修饰变量、方法。
(2)将共性的数据定义为静态的成员变量或方法
(3)没用过非静态成员的,就应该加上static
eg.
private static String name;
private static int age;
private char sex;
public static int getSum(int a, int b, int c){//没用过非静态成员,加上static
return a+b+c;
}
9.定义静态常量
(1)静态常量名称全部大写,两个字母之间用_连接
eg. public static final String COMPANY_NAME = "苹果";
(2)注意:接口中的每个成员变量都默认使用public static final修饰
所有接口中的成员变量已是静态变量,由于接口没有构造方法,
(3)接口为什么没有构造方法
A. 构造方法用于初始化成员变量,但是接口成员变量是常量,无需修改。接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的,
B. 类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器链的调用次序
C. 接口中的方法没有方法体,没法进行初始化,所有不用构造函数。
抽象类为什么有构造方法?
(1)抽象类中的构造方法可以不是抽象的,可以有方法体,可以进行初始化。
10.匿名对象
(1)匿名对象只能使用1次。
11.内部类
(1)定义:写在其它类的内部的类。
(2)可以写在其它类的成员位置和局部位置。//局部位置,指可以写在方法里面。
eg.class 汽车{
class 发动机{//内部类
}
}
(3)内部类分成员内部类和局部内部类
成员内部类:可以使用成员修饰符,public static,.....
也是个类,可以继承,可以实现接口
编译出来的字节码文件格式: Outer$Inner.class //内部类
Outer.class//外部类
(4)调用规则:内部类可以调用外部类的成员(包括private)
外部类要使用内部类的成员,必须建立内部类对象。
12.内部类的调用格式
依靠外部类对象,找到内部类,通过内部类对象,调用内部类的方法
格式:
外部类名.内部类名 变量 = new 外部类对象().new内部类对象();
变量.内部类方法();
eg. Outer.Inner in = new Outer().new Inner();
in.inner();
13.匿名内部类
(1)是局部内部类的一种
(2)前提是继承一个类,或者实现一个接口
(3)格式:
new 接口或者父类(){
};
//从new开始,到分号结束,创建了接口的实现类的对象。
eg. new Smoking(){
public void smoking(){//重写父类方法
System.out.println("人在抽烟“);
}
}.smoking();
14.导包注意事项:
(1)导包,得引入该类真正的文件夹,比如:
Lock类:java/util/concurrent.locks.*; //在这个目录下。
import java.util.*;
public class Test{
Lock lock = new Lock();//会报错,说没导入正确的包。
(1)为什么出现,继承中,不想让子类修改自己的方法或者变量。
final是个修饰符,除了构造方法以外的地方,都可以修饰。
可以修饰类,类的成员,局部变量。
2.造函数为何不能用abstract, static, final修饰?
不同于方法,构造器不能是abstract, static, final的.
(1).构造器不是通过继承得到的,所以没有必要把它声明为final的。
(2).同理,一个抽象的构造器将永远不会被实现,所以它也不能声明为abstract的。
(3).构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。
3.final类的特点:
(1)final修饰类不可以被继承,但是可以继承其它类。比如String类。
(2)final修饰的方法可以被继承,但是不可以被覆盖。
(3)final修饰的变量被称为常量,这些常量只能赋值一次。
final int i = 20;
(4)final修饰的引用变量,保存的内存你地址,终身不变。
(5) final修饰成员变量的时候,保存的是手动赋的值,不是默认值。
eg.final int age = 1;//保存的是1,不是默认的0。
4.成员变量的赋值,有2中实现方式,一种是定义的时候,直接 =赋值
另一种采用构造方法赋值
class Person{
eg. final int age;
public Person(int age){this.age = age}
5. setXXX方法,创建对象之后的事情,不能为final修饰的成员赋值。
6. static 关键字
(1)理解:需要共享的数据用static。比如学生和学校,学生有自己的姓名,但是校名共享一个,校名可以用static修饰。
(2)被静态修饰的成员,可以被类名字直接调用。
7.静态中不能调用非静态。为什么?
静态内容是优先于对象存在,只能访问静态,不能使用this/super.
形象比喻:静态==先人,秦始皇 非静态==后人。 秦始皇不能访问到后人,但是后人,可以挖秦始皇的墓。
eg.public class Test{
String name;
int age;
public static void function(){
System.out.println(name+age);//报错,
}
}
8.static 静态的使用场景
(1)可以修饰变量、方法。
(2)将共性的数据定义为静态的成员变量或方法
(3)没用过非静态成员的,就应该加上static
eg.
private static String name;
private static int age;
private char sex;
public static int getSum(int a, int b, int c){//没用过非静态成员,加上static
return a+b+c;
}
9.定义静态常量
(1)静态常量名称全部大写,两个字母之间用_连接
eg. public static final String COMPANY_NAME = "苹果";
(2)注意:接口中的每个成员变量都默认使用public static final修饰
所有接口中的成员变量已是静态变量,由于接口没有构造方法,
(3)接口为什么没有构造方法
A. 构造方法用于初始化成员变量,但是接口成员变量是常量,无需修改。接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的,
B. 类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器链的调用次序
C. 接口中的方法没有方法体,没法进行初始化,所有不用构造函数。
抽象类为什么有构造方法?
(1)抽象类中的构造方法可以不是抽象的,可以有方法体,可以进行初始化。
10.匿名对象
(1)匿名对象只能使用1次。
11.内部类
(1)定义:写在其它类的内部的类。
(2)可以写在其它类的成员位置和局部位置。//局部位置,指可以写在方法里面。
eg.class 汽车{
class 发动机{//内部类
}
}
(3)内部类分成员内部类和局部内部类
成员内部类:可以使用成员修饰符,public static,.....
也是个类,可以继承,可以实现接口
编译出来的字节码文件格式: Outer$Inner.class //内部类
Outer.class//外部类
(4)调用规则:内部类可以调用外部类的成员(包括private)
外部类要使用内部类的成员,必须建立内部类对象。
12.内部类的调用格式
依靠外部类对象,找到内部类,通过内部类对象,调用内部类的方法
格式:
外部类名.内部类名 变量 = new 外部类对象().new内部类对象();
变量.内部类方法();
eg. Outer.Inner in = new Outer().new Inner();
in.inner();
13.匿名内部类
(1)是局部内部类的一种
(2)前提是继承一个类,或者实现一个接口
(3)格式:
new 接口或者父类(){
};
//从new开始,到分号结束,创建了接口的实现类的对象。
eg. new Smoking(){
public void smoking(){//重写父类方法
System.out.println("人在抽烟“);
}
}.smoking();
14.导包注意事项:
(1)导包,得引入该类真正的文件夹,比如:
Lock类:java/util/concurrent.locks.*; //在这个目录下。
import java.util.*;
public class Test{
Lock lock = new Lock();//会报错,说没导入正确的包。
}
15.变量被声明成了final,必须赋值,否则报错?
不是的,分两种情况。
(1)定义的是成员变量,必须赋值,否则编译器报错。因为编译器初始化这个类的时候,发现一个不可被修改的变量没有值,编译器必然报错。
(2)在方法种定义了final的变量,可以先不赋值,但是如果要使用这个final变量,必须要初始化。因为类初始化的时候,如果没有调用这个方法,是不是调用这个方法里的final变量的,所有先不赋值,编译器不报错。