---------------------- android培训、java培训、期待与您交流! ----------------------
面向对象
类的继承
javak只支持单继承,
不允许多重继承,
但可以有多层继承,
即一个类可以继承某一个类的子类,
如类B继承了类A,
类C又可以继承类B,
那么类C也间接继承了类A。
子类继承父类,
先调用父类无参构造函数,
如父类只有一个有参构造函数,
则编译器就会报错,
但在子类构造函数里加上一个super,
调用父类有参构造函数,
则编译器就不会报错。
例:
class Person{
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
}
class Student extends Person{
public Student(){
//super();//隐式调用父类无参构造函数
super("黄少天",20);//调用父类有参构造函数
}
}
class TestStudent{
public static void main(String[] args){
Student stu=new Student();//先调用子类无参构造函数
}
}
子类对象实例化过程:
先调用子类对应构造函数,
然后执行构造函数里的super()方法(隐式或显式)
再对父类成员变量进行初始化,
再调用父类对应构造函数,
然后对子类成员变量进行初始化,
最后子类继续往下执行代码。
this表示调用当前类里的成员变量,如没有则去调用父类里的成员变量,
而this()表示调用当前类里的构造函数。
1、为什么super和this调用语句不能同时在一个构造函数中出现?
如果一个构造函数同时出现了super和this语句,编译器就会报错,
因为super和this语句,都作为构造函数第一句出现,
只要执行了两个语句中的一个,那么另一个就不会被执行,
除非它们不在同一个构造函数里。
2、为什么super或this语句只能作为构造函数中的第一句出现?
因为实例化执行,都会最先执行构造函数,
如果不把这两个语句放在构造函数第一句中,那么编译器就会报错,
而且,也就没有意义了。
final
final类不能被继承
final方法不能被重写
final变量不能被赋值
抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
接口中的方法都是抽象方法,接口中的属性都是常量。
例:
public class B extends A{}
1、A a = new B();//父类接收子类,对象a却只能调用A类里的成员变量和方法,但显示的是子类里重写方法的结果。
2、A a = b
instanceof
例:
if(a instanceof B){//instanceof操作符可以用它来判断一个实例对象是否属于一个类。
B b= (B)a//把a对象强制转换为b类型
}
接口
接口就好比电脑部件里的主板PCI插槽,而电脑各个部件生产商会严格按照PCI插槽的标准,来生产部件,连接到主板上。
例:
interface PCI{
public void pciStandard();//pci标准
}
class NetWorkFactory implements PCI{//网卡生产商根据pci标准生产
private String name="网卡";
public void pciStandard(){
System.out.println(this.name+"根据pci标准生产");
}
}
class SoundFactory implements PCI{//声卡生产商根据pci标准生产
private String name="声卡";
public void pciStandard(){
System.out.println(this.name+"根据pci标准生产");
}
}
class MainBoardFactory{//主板生产商
public void definePCI(PCI pci){//检查符合pci标准
pci.pciStandard();
}
}
class Machine{//机器检查是否符合标准
public static void main(String[] args){
MainBoardFactory mbf=new MainBoardFactory();
mbf.definePCI(new NetWorkFactory());
mbf.definePCI(new SoundFactory());
}
}
匿名内部类
一个类如果继承或实现某个类时,就可以使用匿名内部类。
匿名内部类是把对象名省略。
例:(与上面接壤)
mbf.definePCI(new PCI() {//可以把new接口,看成是子类对象,只是对象没有名字。
@Override
public void pciStandard() {
System.out.println("网卡使用主板PCI槽");
}
});
mbf.definePCI(new PCI() {
@Override
public void pciStandard() {
System.out.println("声卡使用主板PCI槽");
}
});
---------------------- android培训、java培训、期待与您交流! ----------------------