Java 面向对象三大特征之一,继承
让类与类之间产生关系,出现子与父类关系,提高了代码的复用性、维护性,是多态的前提
Java中只支持单继承,不支持多继承,支持的是多层继承
继承的注意事项:
子类只能继承父类所有非私有的成员(成员方法和成员变量),私有的private继承不了
字类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法
不要为了部分功能而去继承
this和super的区别:
this:代表当前对象的引用,谁来调用就代表谁
super:代表当前对象父类的引用
this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
super.成员变量 调用父类的成员变量
this(...) 调用本类的构造方法
super(...) 调用父类的构造方法
this.成员方法 调用本类的成员方法,也可以调用调用父类的成员方法
super.成员方法 调用父类的成员方法
super(...)或者this(...)必须出现在构造方法的第一条语句上
子类中所有的构造方法默认都会访问父类中空参数的构造方法,字类中如果不写super(),系统会默认加上,用来访问父类的空参构造
方法重写:子父类出现了一摸一样的方法,当子类需要父类的功能,而功能主体子类有自己的特有内容时,可以重写父类中的方法。
方法重写注意事项:父类中私有方法不能被重写,因为父类私有方法子类根本就无法继承
子类重写父类方法时,访问权限不能更低,最好一致
父类静态方法,子类也必须通过静态方法进行重写
重载可以改变返回值类型,只看参数列表
final关键字修饰类
final修饰特点:修饰类,类不能被继承;修饰变量,变量就变成了常量,只允许赋值一次;修饰方法,方法不能被重写
final 修饰的基本类型,值不能被改变
修饰的引用类型,则地址值不能被改变,但是对象中的属性可以改变
final Person p=new Person("zs",33);
p.setName("ls");
p.setAge(55);
System.out.println(p.getName()+"..."+p.getAge());
final修饰变量的初始化时机
显示初始化
在对象构造完毕前即可
package pra_02;
public class j_08 {
public static void main(String[] args){
Cat c=new Cat();
c.color="black";
c.leg_num=4;
c.eat();
c.sleep();
B b=new B();
b.print();
Sun s=new Sun();
s.print();
s.method();
Phone2 p2=new Phone2();
p2.siri();
p2.call();
Student2 s2=new Student2();
s2.setName("zs");
s2.setAge(11);
System.out.println(s2.getName()+"..."+s2.getAge());
s2.eat();
s2.study();
System.out.println(".................");
Student2 s3=new Student2("ls",22);
System.out.println(s2.getName()+"..."+s2.getAge());
s2.eat();
s2.study();
}
}
// 继承的演示
class Animal{
String color;
int leg_num;
public void eat(){
System.out.println("eat....");
}
public void sleep(){
System.out.println("sleep....");
}
}
class Cat extends Animal{
}
class Dog extends Animal{
}
//演示不同名的变量和同名变量的继承
class A{
int num1=10;
int num2=30;
}
class B extends A{
int num2=20;
public void print(){
System.out.println(this.num1); //10
System.out.println(num2); //20 就近原则,子类有,则用子类的,在开发中尽量避免这种情况,因为子类继承父类就是为了使用父类的成员
System.out.println(this.num2); //20 this在本类没有的情况可以调用父类的
System.out.println(super.num2); //30
}
}
//演示不同名方法和同名方法的区别
class Fun{
public void print(){
System.out.println("Fun 1");
}
}
class Sun extends Fun{
public void method(){
System.out.println("Fun 2");
}
public void print(){
super.print(); //super可以调用父类的成员方法
System.out.println("Fun 3"); //当字类和父类有一样的方法,则为重写,如果还想调用,则用super
}
}
//演示方法重写
class Phone{
public void call(){
System.out.println("call~");
}
public void siri(){
System.out.println("siri~");
}
}
class Phone2 extends Phone{
public void siri(){
//super.siri();
System.out.println("siri 1~");
}
}
//使用继承前
class Student{
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public void eat(){
System.out.println("student eat");
}
public void study(){
System.out.println("student study");
}
}
class Teacher{
private String name;
private int age;
public Teacher(){
}
public Teacher(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public void eat(){
System.out.println("teacher eat");
}
public void teach(){
System.out.println("teacher teach");
}
}
//使用继承后
class Person{
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public void eat(){
System.out.println("eat");
}
}
class Student2 extends Person{
public Student2(){
}
public Student2(String name,int age){
super(name,age);
}
public void study(){
System.out.println("Student study");
}
}
class Teacher2 extends Person{
public Teacher2(){
}
public Teacher2(String name,int age){
super(name,age);
}
public void Teach(){
System.out.println("Teacher Teach");
}
}