Javaの高度なオブジェクト指向(コードブロック、継承)

(1)コードブロック

(1)用{}括起来的代码。
(2)分类:
	A:局部代码块
		用于限定变量的生命周期,及早释放,提高内存利用率。{ }
	B:构造代码块
		把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。  构造方法中的代码块
	C:静态代码块
		对类的数据进行初始化,仅仅只执行一次。  static修饰的代码块
(3)静态代码块,构造代码块,构造方法的顺序问题?
	静态代码块 > 构造代码块 > 构造方法

コードブロックを理解するための1つの質問(出力シーケンスは後にマークされています)

public class Test1 {
    
    
    int b=20;
    static int a=10;

    {
    
    
        System.out.println("这是在Test1类中的代码块");//12  //30
        System.out.println("Test1:"+b);//13  //31
        System.out.println("Test1:"+a);//14  //32
    }

    static{
    
    
        System.out.println("这是Test1静态代码块");//2
        System.out.println("Test1静:"+a);//静态只能调用静态,输出b报错//3
    }

    public Test1() {
    
    
        System.out.println("这是Test1构造方法");//15  //33

        {
    
    
            System.out.println("这是Test1构造方法里的代码块");//16  //34
            System.out.println("Test1构造:"+a);//17  //35
            System.out.println("Test1构造:"+b);//18  //36
        }
    }
}

class Test2 extends Test1{
    
    
    {
    
    
        System.out.println("这是Test2中的代码块");//19  //37
        System.out.println("Test2:"+a);//继承Test1中的a//20  //38
        System.out.println("Test2:"+b);//继承Test1中的b//21  //39
    }

    public Test2(){
    
    
        System.out.println("这是Test2中的构造方法");//23  //41
        {
    
    
            System.out.println("这Test2中的方法块");//24  //42
            System.out.println("Test2构造:"+a);//25  //43
            System.out.println("Test2构造:"+b);//26  //44
        }
    }

    {
    
    
        System.out.println("这是在Test2构造方法后的代码块");
    }//22  //40

    static{
    
    
        System.out.println("这是Test2中的静态代码块");//10
        System.out.println("Test2静态:"+a);//11
    }

    }

class Test3{
    
    
    {
    
    
        System.out.println("这是main之前的代码块");
        System.out.println("Test3:"+Test1.a);
    }//全程没有用到不输出

    static{
    
    
        System.out.println("这是main之前的静态代码块");//1
        System.out.println("Test3静态:"+Test1.a);//类名加类变量,用Test1和Test2都可
    }//静态代码块在main前和在main后不影响,都在main之前执行//4
    public static void main(String[] args) {
    
    
        System.out.println("当前位置在main函数中");//5
        System.out.println("创建对象之前:"+Test2.a);//6

        {
    
    
            System.out.println("这是main中的代码块");//main里面不能有静态代码块//7
            System.out.println("创建对象之前代码块:"+Test2.a);//8
        }
        System.out.println("=========创建第一个对象===================");//9

        Test2 test=new Test2();
        System.out.println("创建对象1之后:"+test.a);//27
        System.out.println("创建对象1之后:"+test.b);//28
        System.out.println("===========创建第二个对象=================");//29
        Test2 next=new Test2();
        System.out.println("创建对象2之后:"+next.a);  //45
        System.out.println("创建对象2之后:"+next.b);  //46
    }
}

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

(2)継承

(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,
   这多个类就具备了这些内容。这个关系叫继承。
(2)Java中如何表示继承呢?格式是什么呢?
	A:用关键字extends表示
	B:格式:
		class 子类名 extends 父类名 {}
(3)继承的好处:
	A:提高了代码的复用性
	B:提高了代码的维护性
	C:让类与类产生了一个关系,是多态的前提
(4)继承的弊端:
	A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
		原则:低耦合,高内聚。
		耦合:类与类的关系
		内聚:自己完成某件事情的能力
	B:打破了封装性
(5)Java中继承的特点
	A:Java中类只支持单继承
	B:Java中可以多层(重)继承(继承体系)
(6)继承的注意事项:
	A:子类不能继承父类的私有成员
	B:子类不能继承父类的构造方法,但是可以通过super去访问
	C:不要为了部分功能而去继承
(7)什么时候使用继承呢?
	A:继承体现的是:is a的关系。
	B:采用假设法
(8)Java继承中的成员关系
	A:成员变量
		a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
		b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
			子类的方法访问变量的查找顺序:
				在子类方法的局部范围找,有就使用。
				在子类的成员范围找,有就使用。
				在父类的成员范围找,有就使用。
				找不到,就报错。
	B:构造方法
		a:子类的构造方法默认会去访问父类的无参构造方法
			是为了子类访问父类数据的初始化
		b:父类中如果没有无参构造方法,怎么办?
			子类通过super去明确调用带参构造
			子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
			让父类提供无参构造
	C:成员方法
		a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
		b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
			通过子类对象访问一个方法的查找顺序:
				在子类中找,有就使用
				在父类中找,有就使用
				找不到,就报错
(9)两个面试题:
	A:Override和Overload的区别?Overload是否可以改变返回值类型?
	B:this和super的区别和各自的作用?
(10)数据初始化的面试题
	A:一个类的初始化过程
	B:子父类的构造执行过程
	C:分层初始化

継承を理解するための1つの質問

public class Person {
    
    
    private String name;
    private int age;

    public Person(){
    
    }

    public Person(String name,int age){
    
    
        this.name=name;
        this.age=age;
    }

    public String getName(){
    
    
        return this.name;
    }

    public int getAge(){
    
    
        return age;
    }

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

    public void setAge(int age){
    
    
        this.age=age;
    }
}

class Student extends Person{
    
    
    public Student(){
    
    }

    public Student(String name,int age){
    
    
        super(name,age);
    }
}

class Teacher extends Person{
    
    
    public Teacher(){
    
    
    }

    public Teacher(String name,int age){
    
    
        super(name,age);
    }
}

class Test{
    
    
    public static void main(String[] args) {
    
    
        Student s1=new Student();
        s1.setAge(25);
        s1.setName("zs");
        System.out.println(s1.getAge()+"====="+s1.getName());

        Student s2=new Student("ls",78);
        System.out.println(s2.getAge()+"=========="+s2.getName());
    }
}

ここに画像の説明を挿入

静的コードブロック、構築コードブロック、構築メソッドの実行順序静的コードブロック->構築コードブロック->構築メソッド
静的コードブロック:1回だけ実行
構築コードブロック:構築メソッドが呼び出されるたびに実行

クラスの初期化プロセス
メンバー変数の初期化:デフォルトの初期化、表示の初期化、構造の初期化

子親クラスの構築・実行処理
まず、親クラスの構築メソッドを実行してから、サブクラスの構築メソッドを実行します。

サブ
親クラスの初期化最初に親クラスの初期化を実行してから、サブクラスの初期化、つまり階層初期化を実行します

メソッドのオーバーロードとメソッドのオーバーライドの関係
メソッドのオーバーライド:サブクラスでは、メソッドの宣言が親クラスとまったく同じになるという現象があります。
大きなオーバーロード:同じクラスでは、メソッド名は同じで、パラメーターリストが異なります。
メソッドのオーバーロードは戻り値のタイプとは関係がないため、戻り値のタイプを変更できます

オーバーライド:メソッドのオーバーライド
オーバーロード:メソッドのオーバーロード

thisキーワードとsuperキーワードは何を表していますか?そして、それぞれの使用シナリオと機能。

this:代表当前类的对象的引用
super:代表当前父类存储空间的标识
场景:
	成员变量:
			this.成员变量
			super.成员变量
	构造方法:
			this(...)
			super(...)
	成员方法:
		this.成员方法
		super.成员方法

Java入門基礎学習(1)
Java入門基礎学習(2)
Java入門基礎学習(3)
Java入門基礎学習(4)
Java入門基礎学習(5)高度なJavaの共通オブジェクト
(1)
高度なJavaの共通オブジェクト(2)
Java高度なバブルソート
Java高度な選択ソート
Java高度なオブジェクト指向(カプセル化)

おすすめ

転載: blog.csdn.net/qq_45798550/article/details/108061861