(一)代码块
(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进阶之面向对象(封装)