Java中代码块和继承

76 阅读3分钟

1、代码块,是用{}括起来的代码。

    局部代码块,是用与限定变量的生命周期,及早释放,提高内存利用率。

    构造代码块,把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。

    静态代码块,对类的数据进行出事话,仅仅只执行一次。

2、继承,把多个类中相同相同的成员给提取出来定义到一个独立的类中,然后让多个类和该独立的类产生一个关系,这多个类就具备了这些内容,这个关系叫继承。

java中继承的关键字是extends。格式为class 子类名 extends 父类名{}

继承可以提高的代码的复用性,提高代码的维护性,让类与类之间产生一个关系,是多态的前提。

继承的弊端,让类的耦合性增强,这样某个类的改变,就会影响其他和该类相关的类。打破了封装性。

java中继承的特点,只支持单继承。可以多层继承。

举例:

class GrandFather{
	public void show1() {
		System.out.println("I am grandfather");
	}
}

class Father extends GrandFather{
	public void show2() {
		System.out.println("I am father");
	}
}

class Son extends Father{
	public void show3() {
		System.out.println("I am son");
	}
}

public class Main {
	public static void main(String[] args) {
		Son s=new Son();
		s.show1();
		s.show2();
		s.show3();
	}
}

继承的注意事项,子类不能继承父类的私有成员。子类不能继承父类的构造方法,但是可以通过super去访问。不要为了部分功能去继承


class Father{
	private int num1=10;
	int num2=20;
	
	private void show1() {
		System.out.println(num1);
		System.out.println(num2);
	}
	
	public void show2() {
		System.out.println(num1);
		System.out.println(num2);
	}
}

class Son extends Father{
	
}

public class Main {
	public static void main(String[] args) {
		Son s=new Son();
		//s.show1();子类不能继承父类的私有方法
		//System.out.println(s.num1);子类不能访问父类的私有变量
		s.show2();
		System.out.println(s.num2);

	}
}

java中的成员关系

    a:成员变量,子类的成员变量名称和父类中的成员变量名称不一样很简单,如果不一样子类的方法访问变量的查找顺序。在子类方法的局部范围找,有就使用。在子类的成员范围找,有就使用。在父类的成员范围找,有就使用。找不到,就报错。

    b:构造方法,子类的构造方法默认会去访问父类的无参构造方法,是为了子类访问父类数据的初始化。如果父类中没有无参构造方法,子类通过super去明确调用带参构造。子类通过this调用本身的其他构造,但是一定会有一个区访问了父类的构造,让父类提供无参构造

    c:成员方法,子类的成员方法和父类的成员方法不一样很简单,如果不一样找的顺序为,在子类中找,有就使用。在父类中找,有就使用。

举例:


class Father{
	public Father() {
		System.out.println("father");
	}
}

class Son extends Father{
	
	public Son() {
		//super();//这个不写super,默认为有super
		System.out.println("son");
	}
	public void show() {
		System.out.println("hello");
	}
}

public class Main {
	public static void main(String[] args) {
		Son s=new Son();//在构造时首先输出的是父类的构造方法
		s.show();
	}
}

class Person{
	private String name;
	private int age;
	
	public Person() {}//如果这个注销,下面的继承将编译错误
	
	public Person(String name,int age) {
		this.name=name;
		this.age=age;
	}//这个用的不多,但是存在
	
	public void setName(String name) {
		this.name=name;
	}
	
	public String getName() {
		return name;
	}
	
	public void setAge(int age) {
		this.age=age;
	}
	
	public int getAge() {
		return age;
	}
}
class Student extends Person{
	public Student() {}
	
	public Student(String name,int age) {
		super.setName(name);//super调用的是父类的
		super.setAge(age);
		//或者
		//super(name,age);
	}
}

public class Main {
	public static void main(String[] args) {
		//方式1
		Student s=new Student();//无参构造会自动生成
		s.setName("贺志营");
		s.setAge(20);
		System.out.println(s.getName()+"---"+s.getAge());
		
		//方式2
		Student s1=new Student("贺志营",20);
		System.out.println(s1.getName()+"---"+s1.getAge());
	}
}