Java面向对象——继承,this,super和final关键字的学习

38 篇文章 1 订阅

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");
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值