java基础2

2018-11-08  本文已影响0人  MononokeHime

Java 中继承的特点

this与super的区别

this代表本类对应的引用
super代表父类存储空间的表示
怎么用?

继承中构造方法的关系

子类中所有的构造方法默认都会访问父类中的空参数的构造方法
为什么呢?

如果父类中没有无参构造方法,该怎么办呢?

final关键字

final的特点

被final修饰的变量只能赋值一次
final int num;num = 10或者
final int num = 10;

多态

同一个对象,在不同的时刻体现出来的不同状态
多态的前提:
A:要有继承关系
B:要有方法重写
C:要有父类指向子类对象
父类 f = new 子类()
f调用的方法只能是被子类重写的方法
<u>多态体现在表面上调用父类的方法,其实调用的是子类的方法!</u>

多态的成员访问特点:
A:成员变量
编译看左边,运行看左边
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边(静态和类相关,算不上重写,所以,访问还是看左边的)

多太的弊端,不能使用子类的新功能(即没有重写的方法)
解决方法:可以借助向下转型
子类 z = (子类)f

class KongZiDad{
    int age = 40;
    public void teach(){
        System.out.println("教Java");
    }
}

class KongZi extends KongZiDad{
    int age = 20;
    public void teach(){
        System.out.println("教论语");
    }
    public void playGame(){
        System.out.println("英雄联盟");
    }
}

class HelloWorld{
    public static void main(String[] args) {
        KongZiDad kzd = new KongZi();
        System.out.println(kzd.age);  // 40
        kzd.teach();  // 教论语
        // kzd.playGame(); 无法调用
        KongZi kz = (KongZi)kzd; 
        System.out.println(kz.age); // 20
        kz.teach(); // 教论语
        kz.playGame(); // 英雄联盟
    }
}

如何更好的理解多态呢?

多态类的内存图

抽象类

定义了抽象方法的类是抽象类

abstract class Animal{
    public abstract void eat();
}

抽象类有构造方法,但抽象类不能实例化。抽象类中的构造方法是子类访问父类的初始化数据。
抽象类的子类问题:

抽象类的成员

接口

格式:interface 接口名 {}
实现:class 类名 implement 接口名 {}
注意:

接口中成员的特点:

抽象类和接口区别

抽象类:被继承,体现的是“is a”的关系,抽象类中定义的是该继承体系的共性功能
接口:被实现,体现的是“li'ke a”的关系,接口中定义的是该继承体系的扩展功能

类名,抽象类名,接口名做为参数传递问题

1.类名作为形参和返回值类型,跟不同类型一样
2.抽象类名:因为抽象类不能实例化,必须借助多态实现

abstract class Person {
    public abstract void study();
}

class PersonDemo {
    public void method(Person p) {//p; p = new Student();  Person p = new Student(); //多态
        p.study();
    }
}

//定义一个具体的学生类
class Student extends Person {
    public void study() {
        System.out.println("Good Good Study,Day Day Up");
    }
}

class PersonTest {
    public static void main(String[] args) {
        //目前是没有办法的使用的
        //因为抽象类没有对应的具体类
        //那么,我们就应该先定义一个具体类
        //需求:我要使用PersonDemo类中的method()方法
        PersonDemo pd = new PersonDemo();
        Student p = new Student();
        pd.method(p);
    }
}
abstract class Person {
    public abstract void study();
}

class PersonDemo {
    public Person getPerson() {
        //Person p = new Student();
        //return p; 
        return new Student();
    }
}

class Student extends Person {
    public void study() {
        System.out.println("Good Good Study,Day Day Up");
    }
}

class PersonTest {
    public static void main(String[] args) {
        PersonDemo pd = new PersonDemo();
        Person p = pd.getPerson(); //new Student();  Person p = new Student(); 
        p.study();
    }
}

3.接口名同上

权限修饰符

权限修饰符:
                    本类  同一个包下(子类和无关类)   不同包下(子类)    不同包下(无关类)
        private     Y       
        默认      Y       Y
        protected   Y       Y                           Y
        public      Y       Y                           Y               Y
    修饰符:
        权限修饰符:private,默认的,protected,public
        状态修饰符:static,final
        抽象修饰符:abstract
        
    类:
        权限修饰符:默认修饰符,public
        状态修饰符:final
        抽象修饰符:abstract
        
        用的最多的就是:public
        
    成员变量:
        权限修饰符:private,默认的,protected,public
        状态修饰符:static,final
        
        用的最多的就是:private
        
    构造方法:
        权限修饰符:private,默认的,protected,public
        
        用的最多的就是:public
        
    成员方法:
        权限修饰符:private,默认的,protected,public
        状态修饰符:static,final
        抽象修饰符:abstract
        
        用的最多的就是:public
        
    除此以外的组合规则:
        成员变量:public static final
        成员方法:public static 
                  public abstract
                  public final

内部类

把类定义在其他类的内部,这个类就被称为内部类
内部类的访问特点:

内部类的详细介绍:Java内部类详解

当我们编译的时候,不仅会生成外部类的class文件,还会生成内部类的class文件,格式是外部类名$内部类名.class

匿名内部类

上一篇 下一篇

猜你喜欢

热点阅读