一.final:用途:不希望类被继承,父类某个方法被子类覆盖,类的某个属性值被修改,某个局部变量被修改。final修饰的属性叫做常量,当不为静态时,可在定义时,构造器中,代码块中赋值,如果是静态的则不能在构造器中赋值。创建对象时只要new,类加载只要使用了类就行。父类有final方法,虽然不能被重写,但能进行调用。final和static同时使用,不会导致类被加载
二.抽象类:当父类的某些方法不能确定时,用abstract关键字修饰该方法,抽象类不能被实例化,abstract只能修饰类和方法,不能修饰属性和其他的,抽象方法不能有主体即{};如果一个类继承了抽象类,则必须实现抽象类的所有抽象方法,除非自己也声名为abstract类。抽象类可用于模板设计模式,子类继承可直接使用该方法,写出两个子类的公共部分,方法内容由子类自己使用,抽象类关键字不能与final,static,private等关键字一起用,因为抽象类本质是用于继承,这些关键字限制继承
三.接口:就是给出一些没有实现的方法,封装到一起,当使用时,就将这些方法写出来,如果一个类要implements实现接口,需要将该接口的抽象方法都实现,jdk8以后接口可以有方法体,比如静态方法,或者加关键字default。接口不能被实例化,接口的所有方法是public方法,普通类实现接口就要把接口的所有方法都实现,抽象类不用.。一个类可以实现多个接口,接口中的属性只能是public static final的,静态属性可以直接通过类名访问,非静态不可以,接口可以继承接口。继承的多态:向上转型:父类的引用指向子类的对象,可以调用父类的所有成员,不能调用子类的特有成员。向下转型:子类类型 引用名 = (子类类型) 父类引用;可以调用子类的所有成员,接口也可以实现向下上转型,实现转型,需要有继承关系或者接口关系,访问父类属性用super关键字.。
四.类的五大成员:属性,方法,构造器,代码块,内部成员
内部类:局部内部类定义在外部类的局部位置,通产在方法中,可以访问外部类的所有成员,包含私有的,局部内部类不能添加访问修饰符,但可用final修饰。作用域:只能在他的方法或代码块中
外部其他类不可以访问内部类
五.匿名内部类:本质是内部类,无名字,定义在外部内的局部位置
用途之一:实现接口里的方法需要创建一个类去继承,然后再实现方法,匿名内部类可以直接实现该方法创建匿名类,该类创建一次就消失了,可以访问外部类的所有成员,外部其他类不能访问匿名内部类
public class AnonymousInnerClass { public static void main(String[] args) { Outer04 outer04 = new Outer04(); outer04.method(); } } class Outer04 { private int n1 = 10;//属性 public void method() { //基于接口的匿名内部类 //想使用IA接口,并且创建对象,先写一个类实现该接口,并创建对象 //可以使用匿名类来简化开发 //匿名内部类只能使用一次,但对象可以多次调用 /*IA tiger1 = new Tiger(); tiger.cry();*/ //基于接口的内部类 IA tiger = new IA() { @Override public void cry() { System.out.println("老虎叫唤"); } }; tiger.cry(); //演示基于类的匿名内部类 Father father = new Father("jake"){ //相当于class outer04$2 extends Father @Override public void test() { System.out.println("匿名类重写了test方法"); } }; System.out.println("father对象的运行类型="+father.getClass()); father.test(); //基于抽象类的匿名内部类 Animal animal = new Animal(){ public void eat(){ System.out.println("小狗吃骨头..."); } }; animal.eat(); } } interface IA { public void cry(); } /*class Tiger implements IA{ @Override public void cry() { System.out.println("老虎在咆哮"); } } class Dog implements IA{ @Override public void cry() { System.out.println("小狗汪汪...."); } }*/ class Father { public Father(String name) { //构造器 } public void test() { } } abstract class Animal{ public void eat(){}; }
匿名类的使用案例:
`
成员内部类:没有在方法中也没在代码块中,可以访问外部类的所有成员,包括私有成员可以添加任意的访问修饰符
在外部类的成员方法中创建内部类对象,再调用方法就可访问内部类;外部其他类访问内部类: