java进阶之面向对象(代码块、继承)

(一)代码块

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

一题搞懂代码块(输出顺序后面已经标出)

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
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)继承

(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:分层初始化

一题了解继承

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());
    }
}

在这里插入图片描述
静态代码块和构造代码块、构造方法的执行顺序
静态代码块–>构造代码块–>构造方法
静态代码块:只执行一次
构造代码块:每次调用构造方法都执行

一个类的初始化过程
成员变量的初始化:默认初始化、显示初始化、构造初始化

子父类的构造执行过程
先执行父类的构造方法,再执行子类的构造方法

子父类的初始化
先进行父类初始化,再进行子类,即分层初始化

方法重载和方法重写的关系
方法重写:在子类中,出现和父类中一模一样的方法声明的现象
大的重载:同一个类中,出现的方法名相同,参数列表不同的现象
方法重载能改变返回值的类型,因为它和返回值克类型无关

Override:方法重写
Overload:方法重载

this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。

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

java入门基础学习(一)
java入门基础学习(二)
java入门基础学习(三)
java入门基础学习(四)
java入门基础学习(五)
java进阶之常见对象(一)
java进阶之常见对象(二)
java进阶之冒泡排序
java进阶之选择排序
java进阶之面向对象(封装)

猜你喜欢

转载自blog.csdn.net/qq_45798550/article/details/108061861