7)继承 方法 final

代码块

* a:局部代码块 
	* 在方法中出现;限定变量生命周期,及早释放,提高内存利用率
* b:构造代码块 (初始化块)
	* 在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
* c:静态代码块 
	* 在类中方法外出现,并加上static修饰;用于给类进行初始化,在类加载的时候就执行,并且只执行一次。
	* 一般用于加载驱动
	* 优先于主方法执行
public class Demo1 {
    public static void main(String[] args) {
        Test test = new Test(3);  //构造代码块会在构造函数被调用时执行, 且在这个例子中比"this.id=id;"语句先执行,作用是给对象统一初始化数据;
        System.out.println(test);
    }
}

class Test{
    int id;
    String name;
    
    {
        this.id= 5;
        this.name = "测试";
        System.out.println("这是构造代码块");
    }
    
    Test(int id){
        this.id = id;
    }
    
    public String toString(){
        
        return "name: "+this.name +"  ,   "+"id: "+ this.id ;
            
    }
}

继承

  • A:继承(exten\ds)
    • 让类与类之间产生关系,子父类关系
  • A:继承的好处
    • a:提高了代码的复用性
    • b:提高了代码的维护性
    • c:让类与类之间产生了关系,是多态的前提
  • B:继承的弊端
    • 类的耦合性增强了。
    • 开发的原则:高内聚,低耦合。
    • 耦合:类与类的关系
    • 内聚:就是自己完成某件事情的能力
  • A:Java中类的继承特点
    • a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)
      • 有些语言是支持多继承,格式:extends 类1,类2,…
    • b:Java支持多层继承(继承体系)
    • Java中类的继承特点
      • 如果想用这个体系的所有功能用最底层的类创建对象
      • 如果想看这个体系的共性功能,看最顶层的类

(继承的注意事项和什么时候使用继承)

  • A:继承的注意事项
    • a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
    • b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
    • c:不要为了部分功能而去继承
  • B:什么时候使用继承
    • 继承其实体现的是一种关系:“is a”。
      采用假设法。
      如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
      • 同名的变量 以子类为准

this和super的区别和应用

  • A:this和super都代表什么
    • this:代表当前对象的引用,谁来调用我,我就代表谁
    • super:代表当前对象父类的引用
  • B:this和super的使用区别
    • a:调用成员变量
      • this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
      • super.成员变量 调用父类的成员变量
    • b:调用构造方法
      • this(…) 调用本类的构造方法
      • super(…) 调用父类的构造方法
    • c:调用成员方法
      • this.成员方法 调用本类的成员方法,也可以调用父类的方法
      • super.成员方法 调用父类的成员方法

继承中构造方法的关系

    • 子类中所有的构造方法默认都会访问父类中空参数的构造方法
      一定会访问 在访问子类构造方法之前
    • 因为子类会继承父类中的数据,可能还会使用父类的数据。

    • 所以,子类初始化之前,一定要先完成父类数据的初始化。

    • 其实:

      • 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。
		class Fu {
			static {
				System.out.println("静态代码块Fu");
			}
	
			{
				System.out.println("构造代码块Fu");
			}
	
			public Fu() {
				System.out.println("构造方法Fu");
			}
		}
	
		class Zi extends Fu {
			static {
				System.out.println("静态代码块Zi");
			}
	
			{
				System.out.println("构造代码块Zi");
			}
	
			public Zi() {
				System.out.println("构造方法Zi");
			}
		}
	
		Zi z = new Zi(); 
//静态代码块fu 静态代码块zi 构造代码块fu 构造方法fu
//构造块zi     构造方法zi
//main方法进栈 FU.CLASS ZI.CLASS加载 因为先加载父类 才能加载子类 随着父类加载 静态代码加载 
//然后子类静态代码块加载  子类构造方法-》先找父类构造方法 -》父类构造之前构造代码块

继承中成员方法关系

* 同名的方法  重写   super.方法()调用父类方法
  • A:什么是方法重写
    • 重写:子父类出现了一模一样的方法(注意:返回值类型可以是子父类,这个我们学完面向对象讲)
  • B:方法重写的应用:
    • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类特有的内容。

方法重写的注意事项

  • A:方法重写注意事项
    • a:父类中私有方法不能被重写
      • 因为父类私有方法子类根本就无法继承
    • b:子类重写父类方法时,访问权限不能更低
      • 最好就一致
    • c:父类静态方法,子类也必须通过静态方法进行重写
      • 其实这个算不上方法重写,但是现象确实如此,
    • 子类重写父类方法的时候,最好声明一模一样。

方法重写的面试题

  • A:方法重写的面试题
    • Override和Overload的区别?Overload能改变返回值类型吗?

    • overload可以改变返回值类型,只看参数列表

    • 方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的

    • 方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。

    • 子类对象调用方法的时候:

      • 先找子类本身,再找父类。

final关键字修饰类,方法以及变量的特点

  • A:final概述

  • B:final修饰特点

    • 修饰类,类不能被继承
    • 修饰变量,变量就变成了常量,只能被赋值一次
      一般和public static连用 可以类名.变量名调用
    • 修饰方法,方法不能被重写
  • final 修饰局部变量

    • 方法内部或者方法声明上
    • 基本类型,是值不能被改变
    • 引用类型,是地址值不能被改变,对象中的属性可以改变
  • final修饰变量的初始化时机

    • 显示初始化 (声明的时候赋值)
    • 在对象构造完毕前即可(构造方法中赋值也行)

    继承

class Employee
{
	private String name;
	private double salary;
	private Date  hireDay;
	
	public Employee() {
	}

	public Employee(String name, double salary, int year,int month,int day) {
		this.name = name;
		this.salary = salary;
		GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
		//0代表一月
		hireDay=calendar.getTime();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	public Date getHireDay() {
		return (Date) hireDay.clone();
	}

	public void setHireDay(Date hireDay) {
		this.hireDay = hireDay;
	}
	public void raiseSalary(double byPercent)
	{
		double raise=salary*byPercent/100;
		salary+=raise;
	}
}
package haha;

public class Manager extends Employee //java中所有继承都是共有继承
{//尽管没有显示的getName等方法 但已经继承了
		private double bonus;
	public Manager(String name, double salary, int year, int month, int day) {
		super(name, salary, year, month, day);
		//调用父类构造器  manager构造器不能访问E的私有域
		//使用调用构造器语句必须是第一条语句
		bonus=0;
		//子类没有显示调用父类构造器 会自动调用父类无参构造器
		//如果父类没有不带参数构造器 编译错误
	}
	public double getSalary()
	{
		double baseSalary=super.getSalary();
		return baseSalary+bonus;
         //不能return super.salary  只有employee类的方法可以访问他的私有域
	}
	public void setBouns(double b)
	{   
		bonus=b;
	}
}

package haha;

public class ManagerTest {

	public static void main(String[] args) {
		Manager boss = new Manager("Carl Craker", 80000, 1987, 12, 15);
		boss.setBouns(5000);
		//staff[0].setbouns 不行  编译器将staff看做Employee对象 
		
		Employee[] staff = new Employee[3];
		staff[0] = boss;
		staff[1] = new Employee("Harry Hacker", 50000, 1989,10,1);
		staff[2] = new Employee("Tommy Tester", 40000, 1990,3,15);
		
		for (Employee e : staff) {
			System.out.println("name="+e.getName()+",salary="+e.getSalary());
			//e既可以引用雇员 也可以引用经理 (多态)引用谁就调用谁的getSalary方法(动态绑定) 
		}
            
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值