2019-05-25 java学习日记
this:代表当前对象的引用,谁来调用我,我就代表谁super:代表当前对象父类的引用
this即可调用本类的,也可调用父类的,不过要在本类没有的情况下才能调用
this和super的使用区别
调用成员变量
this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
super.成员变量 调用父类的成员变量
调用构造方法
this(...) 调用本类的构造方法
super(...) 调用父类的构造方法
c:调用成员方法
this.成员方法 调用本类的成员方法,也可以调用父类的成员方法
super.成员方法 调用父类的成员方法
注:
系统会默认给空参构造 ,也会默认给super();语句,
子类中所有的构造方法默认都会访问父类中的空参构造方法。
因为子类会继承父类的数据,可能还会使用父类的数据,
所以子类初始化之前一定要先完成父类数据化的初始化,
其实每一个构造方法的第一条语句默认都是:super() object类是最顶层的父类 。
this和super只能存在一个,super(...)或者this(...)必须出现在构造方法的第一条语句上。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Demo_extends { 2 public static void main(String[] args) { 3 Son s1 = new Son(); 4 System.out.println("姓名:" + s1.getName() + ",年龄:" + s1.getAge()); 5 System.out.println("---------------"); 6 Son s2 = new Son("张三",23); 7 System.out.println(s2.getName() + "..." + s2.getAge()); 8 } 9 } 10 11 class Father { 12 private String name; //姓名 13 private int age; //年龄 14 15 public Father() { //空参构造 16 System.out.println("这是一个空参构造"); 17 } 18 public Father(String name,int age ) { //有参构造 19 this.name = name; 20 this.age = age; 21 System.out.println("这是一个有参构造"); 22 } 23 24 public void setName (String name) { //设置姓名 25 this.name = name; 26 } 27 public String getName () { //获取姓名 28 return name; 29 } 30 31 public void setage (int age) { //设置年龄 32 this.age = age; 33 } 34 public int getAge () { //获取年龄 35 return age; 36 } 37 } 38 39 class Son extends Father{ 40 public Son() { //空参构造 41 this("王五",26); //本类中的构造方法 42 //super(); //调用父类中的构造方法 43 System.out.println("这是一个空参构造"); 44 } 45 public Son(String name,int age) { //有参构造 46 super(name,age); 47 System.out.println("这是一个有参构造"); 48 } 49 50 }
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,
这样即沿袭了父类的功能,又定义了子类特有的内容。
例子
1 class Demo7_Phone { 2 public static void main(String[] args) { 3 Ios8 i = new Ios8(); 4 i.siri(); 5 i.call(); 6 } 7 } 8 9 class Ios7 { 10 public void call() { 11 System.out.println("打电话"); 12 } 13 14 public void siri() { 15 System.out.println("speak English"); 16 } 17 } 18 19 class Ios8 extends Ios7 { 20 public void siri() { 21 22 System.out.println("说中文"); 23 super.siri(); 24 } 25 }
1,父类中私有方法不能被重写,
因为父类私有方法子类根本就无法继承。
2,子类重写父类方法时,访问权限不能更低,最好一致
3,父类静态方法,子类也必须通过静态方法进行重写
这个也算不上方法重写,因为静态只能覆盖静态
4,子类重写父类方法的时候,最好声明一模一样
Overload可以改变返回值类型,只看参数例表。
方法重写:
子类中出现了和父类中方法声明一模一样的方法。
与返回值类型有关,返回值是一致(或者是子父类)的。
方法重载:
本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。
子类对象调用方法的时候:
先找子类本身,再找父类
final修饰的特点
修饰类:类不能被继承
修饰方法:方法不能被重写
修饰变量:变量变成常量,只能被赋值一次(一般会与public static共用)
常量命名规范:如果是一个单词,所以字母大写,如果是多个单词,
每个单词都大写,中间用下划线隔开。
final关键字修饰局部变量
基本类型:是值不能被改变
引用类型:是地址值不能被改变,对象中的属性可以改变
final修饰变量的初始化时机:
1,显示初始化,(成员变量的初始化值是无效的)
2,在对象构造完毕前即可