一.final关键字总结
存在意义(WHY):让类变得不能有子类即让类变得唯一,让变量不能再去更改
1.修饰类的情况:publuc final class{}
2.final修饰方法的时候:这个方法就是最终的方法不能再去修改(后期的重载与重写都不可),所以abstract关键字不能与final并存。那能不能重载呢?看4.
3.修饰局部变量:一次赋值,终生不可更改。
这里注意不可改变的基本数据类型的值,但是引用数据类型不一样,对于引用数据类型来说,不可改变的是地址值,但是内容是可以变的(通过调用里面的方法来实现内容的更替)
/*前面定义一个完整的finalMethod类*/
package Practice;
public class Final {
public static void main(String[] args) {
final FinalMethod finalMethod = new FinalMethod("afu");
System.out.println(finalMethod);
finalMethod.setName("afufu");
System.out.println(finalMethod);
}
}
//你会发现两次打印出的地址位置不变,但是内容变了!
4.修饰成员变量:成员变量具有默认值(0.0d,false,null,0等),所以必须手动赋值
原则:必须保证类中的所有重载构造方法(名字是一样的)都能对final成员变量进行赋值,所以在一个完整的类中setter方法应该注掉。空参构造里面应该加上对final成员变量的赋值,全参构造因为参数列表已经定义了,传进来什么都是有且仅有的唯一的一次赋值。
二.关于修饰符权限问题
1.四种权限修饰符:public > protected > (default) >private
同一类中 V V V V
同一个包中 V V V \
不同包子类中V V \ \
不同包非子类V \ \ \
三.关于内部类
1.几种分类:成员内部类,局部内部类,局部内部类中的匿名内部类
2.成员内部类
基本定义格式 修饰符 class 外部类名称{
修饰符 class 内部类名称{
}
}
注意:内部用外部随意访问,外部使用内部方法等需要创建内部类对象
外部使用成员内部类的方法:直接与间接
直接:利用公式:外部类名称.内部类名称 对象名称 = new 外部类名称().new 内部类名称();
间接:先创建外部类对象,调用外部类方法,方法里面间接使用内部类方法(使用时可以选择匿名创建内部类对象)
外部类某变量与内部类某变量重名问题:局部变量遵循就近原则,外部类名称.this.变量名称(内部调用外部类的成员变量)
外部类只能写public 与 (default)
3.局部内部类
定义在方法体里面的类就是局部内部类。局部内部类不能写权限修饰符!
局部内部类若是想访问方法体中的局部变量,那么这个变量必须是有效final
原因在生存周期问题:局部变量是在栈内存中,方法体在方法区中,new出来的对象在堆内存中,局部变量在方法结束后会立即出栈,而堆内存中的对象会持续存在,直到垃圾回收为止。
4.局部内部类中的匿名内部类
匿名的存在意义:只用一次,节省内存提升运行效率。后期lambda表达式经常用!
(接口名称 对象名称 = )new 接口名称(){
};
5.类作为成员变量的类型:String 其实式lang包下的一个类。
所以我们也可以自己定义一个类比如weapon,在另外一个类正常定义即可
package Practice;
public class Legendes {
private String name;
private int age;
private Weapon weapon;
void attack(){
System.out.println("年龄为" + age + "的" + name + "正在使用" +weapon.getCode() + "攻击敌方小卡拉米");
}
public Ledges() {
}
public Ledges(String name, int age, Weapon weapon) {
this.name = name;
this.age = age;
this.weapon = weapon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Weapon getWeapon() {
return weapon;
}
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
}
6.接口也可以作为成员变量类型。
集合刚才讲的关于匿名局部内部类,接口的实现类若是只用一次,完全可以在方法里面就给他实现了
import SkillImp;
public class Legends{
public static void main(){
Legends legends = new Legends();
lengends.setName("dz");
//lengends.setSkill(new SkillImp());//1.定义一个接口skill,实现类是skillImp
lengends.setSkill(new Skill(){
@override
public void use(){System.out.println("这里是实现类的方法,是匿名内部类作为实现类")}
};
)
}
}
7.接口同样能作为返回值和参数列表
思考:ArrayList这个类里面就是存在接口List,那么我们用多态的写法:
List<String> list = new ArrayList <String>();
package Practice;
import java.util.ArrayList;
import java.util.List;
public class DemoList {
public static void main(String[] args) {
List <String> list = new ArrayList<>();
List <String> result = newListMethod(list);
for (int i = 0; i < result.size(); i++) {
System.out.println(result.get(i));
}
}
public static List<String> newListMethod(List<String> newList){
newList.add("健字号");
newList.add("顶真");
newList.add("怪零");
return newList;
}
}
注意:有返回就一定要有接受!