2019-05-25 java学习日记

面向对象this和 super的区别与应用

this:代表当前对象的引用,谁来调用我,我就代表谁super:代表当前对象父类的引用

this即可调用本类的,也可调用父类的,不过要在本类没有的情况下才能调用

this和super的使用区别

调用成员变量

this.成员变量  调用本类的成员变量,也可以调用父类的成员变量
super.成员变量 调用父类的成员变量

调用构造方法

this(...) 调用本类的构造方法
super(...) 调用父类的构造方法

c:调用成员方法

this.成员方法  调用本类的成员方法,也可以调用父类的成员方法
super.成员方法 调用父类的成员方法

注:

系统会默认给空参构造 ,也会默认给super();语句,
子类中所有的构造方法默认都会访问父类中的空参构造方法。
因为子类会继承父类的数据,可能还会使用父类的数据,
所以子类初始化之前一定要先完成父类数据化的初始化,
其实每一个构造方法的第一条语句默认都是:super() object类是最顶层的父类 。

this和super只能存在一个,super(...)或者this(...)必须出现在构造方法的第一条语句上。

 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 }

 

方法重写Override的注意事项

1,父类中私有方法不能被重写,
因为父类私有方法子类根本就无法继承。

2,子类重写父类方法时,访问权限不能更低,最好一致

3,父类静态方法,子类也必须通过静态方法进行重写

这个也算不上方法重写,因为静态只能覆盖静态

4,子类重写父类方法的时候,最好声明一模一样

Overload可以改变返回值类型,只看参数例表。

方法重写:

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

方法重载:

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

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

先找子类本身,再找父类

final关键字

final修饰的特点

修饰类:类不能被继承
修饰方法:方法不能被重写
修饰变量:变量变成常量,只能被赋值一次(一般会与public static共用)

常量命名规范:如果是一个单词,所以字母大写,如果是多个单词,
每个单词都大写,中间用下划线隔开。

final关键字修饰局部变量

基本类型:是值不能被改变

引用类型:是地址值不能被改变,对象中的属性可以改变

final修饰变量的初始化时机:

1,显示初始化,(成员变量的初始化值是无效的)
2,在对象构造完毕前即可

原文地址:https://www.cnblogs.com/Sherwin-liao/p/10922409.html