标签:
一、继承
1、继承的优点
代码的重用性
子类可以扩展父类的属性和方法
设计应用程序变得更加简单
父类的属性和方法可用于子类
2、如何判断类具有继承关系
类和类的关系
1)has-a(组合)
2)is-a(继承)
3、单继承和多继承
单根性:
在java中,一个类只能有一个父类
传递性:
子类可以将父类的属性和方法传递给自己的子类
4、所有类的根类都是Object(超类,基类)
5、方法重写(以后多态的使用要用到)@Override//注解
1)子类的方法的返回值类型、方法名和形式参数列表,
必须和父类中的是相同的
2)子类的方法的访问修饰符不能比父类更严格
3)子类中重写的异常不能抛出比父类更多的异常
6、构造方法与继承
不像一个超类的成员
super加括号调用父类的构造器,也必须是语句块的第一句
注意:默认情况下,子类的构造器会调用父类的无参构造器,
当父类没有无参构造方法,而子类有无参构造方法时,
需要指明调用的是什么构造方法。
7、super关键字
super.***和super(***);
8、final关键字
使用final修饰一个类,这个类不能再被继承
使用final修饰一个方法,这个方法不能再被重写
9、抽象abstract
在编写类时,通常会在类中定义一些方法,用来描述该类所具有的行为。
在类的方法中,我们编写代码
注意:抽象类是不能被实例化的。
同时抽象类和final不能同时出现,因为抽象类时需要被继承的
抽象方法是没有方法主体的,
抽象方法出现在抽象类中,
抽象方法在子类中必须写出实体,即方法重写,除非子类也是抽象类
意义:
当我们的类或方法没有具体的业务意义的时候,需要用到抽象。
补充:
public、protected修饰的方法和成员可以被子类继承;
而default看是否在同一个包中,在同一个包中可以被子类继承;
private不可以被继承到。
二、多态
多态
1、使用父类的类型引用子类的实例
/*用数组保存5辆汽车:3轿车2客车*/
MotoVehicle[] vehicles = new Motovehicle[5];
vehicles [0] = new Car("1","宝马","宝马550i");
vehicles [1] = new Car("2","宝马","宝马550i");
vehicles [2] = new Car("3","宝马","宝马550i");
vehicles [3] = new Bus("4","宝马","宝马550i");
vehicles [4] = new Bus("5","宝马","宝马550i");
2、实现多态的步骤:(动态的多态:需要在运行当中才知道该调用什么方法)
1)编写父类、派生子类
2)在子类中重写父类的方法
3)用父类的数据类型引用子类对象
4)调用重写的方法
补充:静态的多态叫做方法重载
3、补充
类型转换instanceof
我们在使用Employee salary = new Salary("",1,"",2,200000);时,
用到了向上转换;而Salary s2 = (salary)salary;却是向下转换,
但是我们不知道转化后是否正确。
System.out.println(salary instanceof Employee); //true
System.out.println(salary instanceof Salary); //true
System.out.println(salary instanceof Hourly); //false
三、接口
1、写法
public interface 类名();
2、注意问题
编译的后缀名依然是.java,仍然可以保存为.class;
接口是没有构造方法的,也不能被实例化
可以省略掉public 和 abstract
接口中的方法都是抽象方法
记住把注释写好!
在接口中的成员变量都是公有、静态、常量的
如:public static final name = "abc";
3、实现接口
implements 后加接口名称
实现接口的类必须必须实现接口里所有的方法
一个类可以实现多个接口(类似于多重继承)
Implements和extends都是is-a的关系
接口里可以声明属性,默认都是public static final
接口继承接口是可以多重继承的(一个接口可以继承多个接口)
4、使用接口的原则
1)使用接口解决多继承
2)使用接口为外部类添加功能
3)以面向对象的角度考虑,将一个类与生俱来的特征和行为和
依赖于外部的可选特征和行为分离,让类尽可能的单纯,即接口
5、接口的优点
1)将设计和实现分离,对外(调用者)隐藏了实现( 而通常调用者也不需要关心实现)
2)面向接口编程是oop的核心
6、接口和抽象类的区别
1)接口里的所有方法都是abstract的,所有的属性都是public static final
2)抽象类是接口的部分实现,既能定义abstract方法,
也能定义普通方法的属性,比接口更灵活
补充:
获取当前时间
Data date = new Date();
四、静态成员变量
静态类成员
用类成员(类变量和类方法)
不需要创建实例,可以通过: className.variableName的形式直接调用(类名打点调用)
1、静态初始化块 static { System.out.println("静态代码块"); }
2、非静态初始化块(成员代码块) { System.out.println("非静态代码块"); }
注意:在同一个类中,静态代码块和非静态代码块都在构造器之前被执行。
当这个类继承父类的时候,非静态代码块在父类的构造方法之后执行
即:
静态代码块
父类构造器
非静态代码块
子类构造器
静态代码块是所有成员共享的,所以创建对象只执行一次。
内部类
在java中,还可以在类的内部定义类。
这种在类的内部定义的类,称为内部类。
内部类所在的类称为外部类
内部类的分类
按位置的不同分为成员内部类(写在类当中)和局部内部类(写在方法当中)
成员内部类的特例是静态内部类
局部内部类的特例是匿名内部类
注意:内部类的方法可以访问外部的成员,但静态内部类只能引用静态成员和方法
局部内部类调用的成员变量是由final修饰的
静态内部类的实例化是需要用外部类类名打点实例化的
成员内部类的创建: Outter outter = new Outter(); Outter.Inner1 = outter.new Inner1();
局部内部类的创建: outter.show();(我们已经局部内部类所在的方法中初始化对象)
匿名内部类的创建: 有时候我们局部内部类所在的方法引用到一个接口时,
而接口的内容很少,我们不想再为接口创建一个类,就要用到
匿名内部类:
同上,
outter.print(new Inter(){
@Override
public void printflnface(){
System.out.pirntln("匿名内部类打印");
}
});
标签:
原文地址:http://www.cnblogs.com/lightskyblue/p/4420206.html