云端java 后端查看当前内存中实例的使用情况_父类


云端java 后端查看当前内存中实例的使用情况_System_02


一,构造方法

–1,概述

–创建对象时会自动调用构造方法

–构造方法和其他方法一样也可以重载

–作用:完成对象的创建或者完成对象的初始化

–2,语法:

–普通方法:修饰词 返回值 方法名(参数列表){方法体}

–构造方法:修饰符 类名(参数列表){方法体}

–3,构造方法完成创建对象

package cn.tedu.oop;
 //测试 构造方法Constructor / 构造器
 //总结
 //1,触发的时间节点:构造方法摆在那儿不会主动执行,需要new来触发
 //2,构造方法可以重载,为了方便各种new,体现程序的灵活性
 //3,构造方法在创建对象时,会自动执行
 public class Test1_Constructor {
 public static void main(String[] args) {
 //创建对象测试
 new Student(“1”,2);//触发了public Student(String a,int b)
 new Student();//触发无参构造
 new Student(“1”);//触发了public Student(String name)
 new Student(1);//触发了public Student(int a)
 new Student(1,2);//触发了public Student(int a,int b)
 }
 }
 //创建Student类
 class Student{
 public Student(String a,int b) {
 System.out.println(“含参构造,名字是:”+a+",年龄是:"+b);
 }
 //1,提供构造方法:修饰符 类名(参数列表){方法体}
 //5,默认就会存在无参构造–前提是.不能只提供含参的构造方法
 public Student() { }
 //3,重载-- 在同一个类里,方法名相同,但是参数列表不同
 public Student(String name) {
 System.out.println(“含参构造方法”+name);
 }
 public Student(int a) {
 System.out.println(“含参构造方法”+a);
 }
 public Student(int a,int b) {
 System.out.println(“含参构造方法”+a+b);
 }
 }
--4,构造方法完成对象的初始化
	package cn.tedu.oop;
	//测试 构造方法 初始化对象信息
	public class Test2_Constructor2 {
		public static void main(String[] args) {
			//1,需求:在创建对象时,给成员变量初始化
			Student2 s = new Student2("钟南山",85);
			//6,获取 私有属性 的值
			System.out.println(  s.getName()  );//钟南山
			System.out.println(  s.getAge()   );//85
		}
	}
	class Student2{
		//2, 给成员变量初始化--setXxx()--直接构造方法赋值
		private String name;
		private int age;
		//5,只对外提供获取方式
		public String getName() {
			return name;
		}
		public int getAge() {
			return age;
		}
		//3,默认就存在的 无参构造
		public Student2() {}
		//4,提供含参构造,并完成成员变量的初始化
		public Student2(String a,int b) {
			name = a;
			age = b;
			
		}
	}

二,代码块
–1,概述
–被花括号包起来的一段代码就叫代码块
–代码块的位置不同,作用用法名字都不同
–2,构造代码块
–成员位置(类里方法外)的代码块叫构造代码块
–作用:通常用于抽取构造方法中的共性代码
–顺序:new时,先调用构造代码块,然后调用构造方法,优先于构造方法加载
–3,局部代码块
–局部位置(方法里)的代码块叫局部代码块
–作用:通常用于控制变量的作用范围
–4,测试:

package cn.tedu.oop;
 //测试 代码块
 //总结
 //1,创建对象时:本来是只会触发构造方法,但是,如果有构造代码块,就会先触发构造代码块再执行构造方法
 //2,调用方法时:顺序执行方法里的代码,如果有局部代码块也就一起执行
 //3,执行顺序:new时–构造代码块>构造方法,调用方法时–局部代码块
 //4,构造代码块–用来提取构造方法的共性–new时才触发
 //5,局部代码块–用来控制变量的作用范围–调用方法时才触发
 public class Test3_Block {
 public static void main(String[] args) {
 new Person().show();//触发无参构造
 new Person(“熊大”);//触发含参构造
 }
 }
 //创建Person类
 class Person{
 //1,构造代码块:位置是在成员位置–触发节点是 new时–先执行构造代码块再执行构造方法
 //–作用:抽取构造方法的共性
 int age ;
 {
 age = 0 ;//提取了所有构造方法的共性功能
 System.out.println(“构造代码块”);
 }
 public Person() {
 System.out.println(“无参构造方法”+age);
 }
 public Person(String name) {
 System.out.println(“含参构造方法”+name+age);
 }
 //2,局部代码块:位置是在方法里–触发节点是 当方法被调用时–用来控制变量的作用范围
 public void show() {
 {
 int x = 10;
 System.out.println(x);
 System.out.println(“局部代码块”);
 }
 }
 }

三,this关键字
–1,代表本类对象的一个引用对象
–2,作用:
–用来区分同名的成员变量和局部变量
–用来完成构造方法间互相调用
–3,测试1

package cn.tedu.oop;
 //测试 this关键字
 //总结
 //当局部变量名 和 成员变量名 相同时,需要用this调用 成员变量
 public class Test4_This {
 public static void main(String[] args) {
 //通过对象,来访问类里的成员(成员变量和成员方法)
 new Demo().test();
 // Demo d = new Demo() ;
 // System.out.println( d.name );
 System.out.println( new Demo().name );
 }
 } 
 //创建Demo类
 class Demo{
 String name ;
 int count = 20 ;//成员变量
public void test() {
			int count = 10;//局部变量
			System.out.println(count);//变量的就近原则,会使用局部变量 的值 10
			System.out.println(name);//成员变量
			//1,想要使用  和  局部变量 同名的 成员变量count--this调用成员变量
	//this表示的是本类的对象的引用--底层帮你new了一个本类对象--Demo this = new Demo();
			System.out.println( this.count );//20,成员变量
		}
	}
--4,测试2
	package cn.tedu.oop;
	//测试   this--用来完成 构造方法间 互相调用
	//总结
	//1,如果在构造方法间,互相调用时,this不能省略
	//2,位置必须是第一条语句
	public class Test5_This2 {
		public static void main(String[] args) {
	//		new Demo2();
			new Demo2(1);
		}
	}
	class Demo2{
		 public Demo2() {
			 //1,在 无参构造里  调用 含参构造
	//		 this(10);
			 System.out.println("无参构造");
		 }
		 public Demo2(int a) {
			 //2,在 含参构造里  调用 无参构造
			 this();//3,在构造方法中,使用this关键字,必须是第一条语句
			 System.out.println("含参构造"+a);
		 }
	}

四,继承
–1,概述
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数 据或新 的功能,也可以用父类的功能,但不能选择性地继承父类/超类/基类。
–2,好处
提高父类代码的复用性,减少子类代码的编写,提高开发效率
–3,特点
–使用extends关键字
–相当于子类把父类的功能复制了一份
–java只支持单继承
–继承可以传递(爷爷,儿子,孙子的关系)
–不能继承父类的私有成员
–继承多用于功能的修改,子类可以拥有父类的功能的同时,进行功能拓展
–像是is a 的关系
–4,入门案例

package cn.tedu.oop;
 //测试 继承 
 public class Test6_Extends {
 public static void main(String[] args) {
 //创建Dog对象测试
 new Dog().eat();
 new Dog().sleep();
 System.out.println( new Dog().name );
 }
 }
 class God{
 String name ;
 }
 //1,父类来了–提取子类的共性–提高了代码的复用性
 class Animal extends God{
 //5,父类的私有成员(成员变量/成员方法)不能被继承
 private double sifangmoney = 100 ;
public void eat() {
			System.out.println("啥都吃");
		}
	}
	//2,子类想拥有父类的功能--需要发生继承关系
	class Dog extends Animal{//4,java只支持单继承
		//3,相当于子类把父类的功能复制了一份
		//6,除了能用父类继承来的,还可以自己做扩展
		public void sleep() {
			System.out.println("sleep()..");
		}
	}
	class Cat{
	}

--5,super关键字
	--1,在子类中用,用来访问父类的成员(成员变量/成员方法)
	--2,super表示父类对象的引用,底层自动创建了一个父类的对象
	--3,如果在构造方法里使用super关键字,位置上必须是第一条语句
--6,方法的重写override
	--1,重写的前提是:发生继承关系+子类的方法声明和父类一样
	--2,啥时候需要重写?--想要改,改掉父类原来的实现时

一,继承的使用
–1,成员变量

package cn.tedu.oop;
 // 测试 继承成员变量 的使用
 //总结 : 在子类中,想用父类的成员变量
 //1,子类和父类的变量名不相同时,可以省略super.
 //2,子类和父类的变量名相同,必须用super来调用父类的资源,不能省略
 public class Test1_Extends {
 public static void main(String[] args) {
 new Zi().show();
 }
 }
 class Fu{
 int count = 10;
 int sum = 30 ;
 }
 class Zi extends Fu{
 int num ;
 int sum = 20 ;
public void show() {
			int sum = 10 ;
			System.out.println(sum);//10,就近原则
			System.out.println(num);//0,使用了默认值
			System.out.println(this.sum);//this能够调用本类的成员变量
			
			//1,super代表父类对象的引用.可以在子类中,使用父类的内容
			//2,相当于super帮你创建了一个父类对象,Fu super = new Fu();
			System.out.println(super.count);//10,用了父类的 不同名的变量,可以省略super.
			System.out.println(super.sum);//30,用了父类的,和子类同名了
		}
		
	}



--2,成员方法
	package cn.tedu.oop;
	//测试 继承成员方法 的使用
	//1,子类 可以继承父类的方法们 -- 可以直接使用  
	//2,子类 可以进行扩展  -- 可以直接使用
	//3,子类 可以修改继承来的方法 -- 方法的重写override
	//4,什么时候需要重写?--想要改时!!!
	public class Test2_Extends2 {
		public static void main(String[] args) {
			//4,创建子类对象测试
			Zi2 zi = new Zi2();
			zi.eat();//重写前,使用了父类的,重写后,使用子类的
			zi.study();//重写前,使用了父类的,重写后,使用子类的
			zi.sleep();//子类特有的
		}
	}
	class Fu2{
		public void eat() {
			System.out.println("爸爸在吃猪肉");
		}
		public void study() {
			System.out.println("爸爸在学搓麻");
		}
	}
	class Zi2 extends Fu2{
		//2,子类可以把父类的所有方法都继承来使用,也可以修改(方法重写)
		//要求:继承+子类的方法声明和父类必须一样
		public void eat() {
			//3,调用父类原来的eat()--重写并不会影响父类的原有功能
	//		super.eat();
			System.out.println("儿子在吃菜");
		}
		public void study() {
			System.out.println("儿子在学java");
		}
		//1,子类 可以继承父类的方法们   还可以扩展自己的功能
		public void sleep() {
			System.out.println("sleep()...");
		}
		
	}

--3,构造方法
	package cn.tedu.oop;
	//测试 继承构造方法 的使用
	//总结
	//1,子类的构造方法里,默认就会存在super()--去调用父类的 无参构造
	//2,当创建子类对象时, 先执行  父类的构造方法 , 再执行 子类的构造方法
	public class Test3_Extends3 {
		public static void main(String[] args) {
			//3,创建子类对象测试
			new Zi3();//会先去执行父类的无参构造,再执行自己的
		}
	}
	class Fu3{
		//4,如果父类没提供无参构造(也就是只提供了含参构造)
	//	public Fu3() {
	//		System.out.println("父类的 无参构造");
	//	}
		public Fu3(int a) {
			System.out.println("父类的 含参构造"+a);
		}
	}
	class Zi3 extends Fu3{
		public Zi3() {
			//1,在子类的构造方法中,会隐藏着一行代码super()
	//		super();//2,会自动执行父类的无参构造--如果父类不提供无参构造会报错
			//5,调用 父类的 含参构造?
			super(10);//6,当super关键字,出现在构造方法里时,位置必须是第一条语句
			System.out.println("子类的 无参构造");
		}
		
	}

二,static关键字
–1,特点
–可以修饰成员变量,成员方法
–可以直接被类名调用
–随着类的加载而加载,优先于对象加载
–只加载一次,就会一直存在,不再开辟新空间
–全局唯一,全局共享
–static不能和this或者super共用,因为有static时可能还没有对象
–静态只能调用静态,非静态可以随意调用
–2,测试

package cn.tedu.oop;
 //测试 静态关键字
 //总结:
 //1,静态的调用关系—静态只能调用静态–非静态调用啥资源都可以
 //2,静态资源是加载非常早的,随着类的加载就已经加载进内存了,比对象早
 //3,静态资源的访问方式:通过对象调用 + 通过类名调用
 public class Test4_Static {
 public static void main(String[] args) {
 //2,静态资源优先于对象加载,因为是随着类的加载就已经加载了
 Student.coding();
 System.out.println(Student.name);
Student s = new Student();
			s.study();
			System.out.println(s.age);
			
	//1,静态资源,多了一种访问方式,除了可以用对象访问,更提倡用类名直接调用
	//		s.coding();
	//		System.out.println(s.name);
			Student.coding();
			System.out.println(Student.name);
			
			//3,静态资源是共享资源,能够被多个对象共享
			Student s1 = new Student();
			s1.name="陈子枢";
			
			Student s2 = new Student();
			System.out.println(s2.name);//陈子枢
		}
	}
	class Student{
		//普通资源 
		int age = 10;
		public void study() {
			//6,非静态调用关系? -- 调用任意资源
			System.out.println(age);
			System.out.println(name);
			coding();
			System.out.println("正在学习java");
		}
		//静态资源
		static String name ;
		static public void coding()  {
			//4,静态资源里,不能使用this或者super关键字!
	//		this.study();
	//		super.
			//5,静态调用关系? -- 只能调用静态,不能调用非静态的
			System.out.println(name);
	//		study();
			System.out.println("正在敲代码");
		}
	}

三,static代码块

–1,一段被花括号包起来的代码,而且被static修饰
 static{…}
 –2,位置是在成员位置,也拥有static关键字的特点
 –3,测试
 package cn.tedu.oop;
 //测试 代码块
 //1,静态代码块:用来初始化项目–位置在成员位置
 //2,执行顺序:
 //类加载时 : 静态代码块
 //实例化时 : 构造代码块 > 构造方法
 //方法调用时 : 局部代码块
 public class Test5_Block {
 public static void main(String[] args) {
 StaticDemo s = new StaticDemo();//先执行构造代码块然后执行构造方法
 s.show();//执行局部代码块
StaticDemo s2 = new StaticDemo();
		}
	}
	class StaticDemo{
		//静态代码块--位置也是在成员位置--用来完成项目的初始化
		//--只加载一次,在类第一次被加载时就跟着一起加载了(类的资源)
		static{
			System.out.println("静态代码块");
		}
		
		//构造代码块--位置是在成员位置--用来提取构造方法的共性
		{
			System.out.println("构造代码块");
		}
		//构造方法
		public StaticDemo() {
			System.out.println("构造方法");
		}
		//局部代码块--位置是在方法里--用来控制变量的作用范围
		public void show() {
			{	
				System.out.println("局部代码块");
			}
		}
	}

四,final关键字
–1,让子类的重写权限变得可控.如果父类的某个方法不让子类重写,可以用final修饰变成最终方法
–2,表示最终的意思.可以修饰类,成员变量,成员方法
–3,测试

package cn.tedu.oop;
 //测试 final关键字
 //1,final 修饰的类是最终的类,不能被继承
 //2,final 修饰的变量,是一个最终的变量,值不能被修改,称之为是常量
 //3,final 修饰的方法,不能被重写
 public class Test6_Final {
 public static void main(String[] args) {
 //创建子类对象测试
 Son s = new Son();
 s.eat();
 // s.sum = 20 ;//final前可以改也能使用
 System.out.println(s.SUM);
 }
 }
 //1,final修饰的类是最终的类,不能被继承–The type Son cannot subclass the final class Father
 //final class Father{
 class Father {
 //3,final 修饰的变量,final用来修饰常量–The final field Father.sum cannot be assigned
 // final int sum = 10 ;
 static final int SUM = 10 ;
 //2,final 修饰的方法,只能用不能被重写–Cannot override the final method from Father
 final public void eat() {
 System.out.println(“Father…eat()”);
 }
 }
 class Son extends Father{
 // //想要改,发生了重写!!
 // public void eat() {
 // System.out.println(“Son…eat()”);
 // }
 }

五,多态
–1,就是指同一个对象,在不同时刻,代表的对象不同.就是指同一个对象的多种形态.
–2,多态的作用 – 用来统一调用标准!!! 一切向父类看齐
–3,好处是 : 做出通用编程,本质上就是不关心具体的子类的类型,屏蔽了子类之间的不同,可以把 子类当做父类来看.
–4,特点
–前提: 继承关系 + 方法的重写
–5,测试

package cn.tedu.oop;
 //测试 多态
 public class Test7_Multi {
 public static void main(String[] args) {
 //创建子类对象测试
 new Dog().eat();//重写前执行父类的,重写后执行子类的
 //创建多态对象测试
 Animal a = new Dog();//口诀1:父类引用 指向 子类对象
 //口诀2:编译看左边,运行看右边
 //编译看左边–是指想要保存成功,向左边也就是 向父类看齐–统一标准!!
 //运行看右边–是指结果向右边看齐也就是看子类的干活结果
 a.eat();//狗吃肉
 // a.test();//test()是子类的特有方法,多态对象只能调用 父类的
 }
 }
 class Animal{
 public void eat() {
 System.out.println(“啥都吃”);
 }
 }
 //1,多态的前提:继承 + 方法重写(方法声明和父类一样)
 class Dog extends Animal{
 public void eat() {
 System.out.println(“狗吃肉”);
 }
 public void test() {
 System.out.println(“test…”);
 }
 }

六,多态的使用
–1,成员变量
–2,成员方法
–3,静态成员
–4,测试

package cn.tedu.oop;
 //测试 多态的使用
 //总结
 //1,多态中,的成员变量 – 用父类的
 //2,多态中,的成员方法 – 用父类的方法声明,用子类的方法体
 //TODO 3,多态中 ,的 静态资源?
 public class Test8_UseMulti {
 public static void main(String[] args) {
 //创建多态对象–父类引用 指向 子类对象
 Fu4 fu = new Zi4();
 //编译看左边,运行看右边
 System.out.println( fu.name );//成员变量用谁的?–父类的
 //多态中,方法声明用–父类的 ,方法体用–子类的(因为重写了)
 fu.show();//成员方法用谁的?–子类的(重写了)
 fu.test();//成员方法用谁的?–父类的(没重写)
 }
 }
 class Fu4{
 String name = “尼古拉斯.赵四” ;
 public void show() {
 System.out.println(“Fu4…show()”);
 }
 final public void test() {//被final了,不让子类重写了!
 System.out.println(“Fu4…test()”);
 }
 }
 class Zi4 extends Fu4{
 String name = “Anglelababa”;
 public void show() {
 System.out.println(“Zi4…show()”);
 }
 }
  • java文件的运行过程 一,继承的使用 –1,成员变量
•  package cn.tedu.oop;
 // 测试 继承成员变量 的使用
 //总结 : 在子类中,想用父类的成员变量
 //1,子类和父类的变量名不相同时,可以省略super.
 //2,子类和父类的变量名相同,必须用super来调用父类的资源,不能省略
 public class Test1_Extends {
 public static void main(String[] args) {
 new Zi().show();
 }
 }
 class Fu{
 int count = 10;
 int sum = 30 ;
 }
 class Zi extends Fu{
 int num ;
 int sum = 20 ;
public void show() {
 		int sum = 10 ;
 		System.out.println(sum);//10,就近原则
 		System.out.println(num);//0,使用了默认值
 		System.out.println(this.sum);//this能够调用本类的成员变量
 		
 		//1,super代表父类对象的引用.可以在子类中,使用父类的内容
 		//2,相当于super帮你创建了一个父类对象,Fu super = new Fu();
 		System.out.println(super.count);//10,用了父类的 不同名的变量,可以省略super.
 		System.out.println(super.sum);//30,用了父类的,和子类同名了
 	}
 	
 }

–2,成员方法

package cn.tedu.oop;
 //测试 继承成员方法 的使用
 //1,子类 可以继承父类的方法们 – 可以直接使用
 //2,子类 可以进行扩展 – 可以直接使用
 //3,子类 可以修改继承来的方法 – 方法的重写override
 //4,什么时候需要重写?–想要改时!!!
 public class Test2_Extends2 {
 public static void main(String[] args) {
 //4,创建子类对象测试
 Zi2 zi = new Zi2();
 zi.eat();//重写前,使用了父类的,重写后,使用子类的
 zi.study();//重写前,使用了父类的,重写后,使用子类的
 zi.sleep();//子类特有的
 }
 }
 class Fu2{
 public void eat() {
 System.out.println(“爸爸在吃猪肉”);
 }
 public void study() {
 System.out.println(“爸爸在学搓麻”);
 }
 }
 class Zi2 extends Fu2{
 //2,子类可以把父类的所有方法都继承来使用,也可以修改(方法重写)
 //要求:继承+子类的方法声明和父类必须一样
 public void eat() {
 //3,调用父类原来的eat()–重写并不会影响父类的原有功能
 // super.eat();
 System.out.println(“儿子在吃菜”);
 }
 public void study() {
 System.out.println(“儿子在学java”);
 }
 //1,子类 可以继承父类的方法们 还可以扩展自己的功能
 public void sleep() {
 System.out.println(“sleep()…”);
 }

–3,构造方法

package cn.tedu.oop;
 //测试 继承构造方法 的使用
 //总结
 //1,子类的构造方法里,默认就会存在super()–去调用父类的 无参构造
 //2,当创建子类对象时, 先执行 父类的构造方法 , 再执行 子类的构造方法
 public class Test3_Extends3 {
 public static void main(String[] args) {
 //3,创建子类对象测试
 new Zi3();//会先去执行父类的无参构造,再执行自己的
 }
 }
 class Fu3{
 //4,如果父类没提供无参构造(也就是只提供了含参构造)
 // public Fu3() {
 // System.out.println(“父类的 无参构造”);
 // }
 public Fu3(int a) {
 System.out.println(“父类的 含参构造”+a);
 }
 }
 class Zi3 extends Fu3{
 public Zi3() {
 //1,在子类的构造方法中,会隐藏着一行代码super()
 // super();//2,会自动执行父类的无参构造–如果父类不提供无参构造会报错
 //5,调用 父类的 含参构造?
 super(10);//6,当super关键字,出现在构造方法里时,位置必须是第一条语句
 System.out.println(“子类的 无参构造”);
 }


二,static关键字
–1,特点
–可以修饰成员变量,成员方法
–可以直接被类名调用
–随着类的加载而加载,优先于对象加载
–只加载一次,就会一直存在,不再开辟新空间
–全局唯一,全局共享
–static不能和this或者super共用,因为有static时可能还没有对象
–静态只能调用静态,非静态可以随意调用
–2,测试

package cn.tedu.oop;
 //测试 静态关键字
 //总结:
 //1,静态的调用关系—静态只能调用静态–非静态调用啥资源都可以
 //2,静态资源是加载非常早的,随着类的加载就已经加载进内存了,比对象早
 //3,静态资源的访问方式:通过对象调用 + 通过类名调用
 public class Test4_Static {
 public static void main(String[] args) {
 //2,静态资源优先于对象加载,因为是随着类的加载就已经加载了
 Student.coding();
 System.out.println(Student.name);
Student s = new Student();
			s.study();
			System.out.println(s.age);
			
	//1,静态资源,多了一种访问方式,除了可以用对象访问,更提倡用类名直接调用
	//		s.coding();
	//		System.out.println(s.name);
			Student.coding();
			System.out.println(Student.name);
			
			//3,静态资源是共享资源,能够被多个对象共享
			Student s1 = new Student();
			s1.name="陈子枢";
			
			Student s2 = new Student();
			System.out.println(s2.name);//陈子枢
		}
	}
	class Student{
		//普通资源 
		int age = 10;
		public void study() {
			//6,非静态调用关系? -- 调用任意资源
			System.out.println(age);
			System.out.println(name);
			coding();
			System.out.println("正在学习java");
		}
		//静态资源
		static String name ;
		static public void coding()  {
			//4,静态资源里,不能使用this或者super关键字!
	//		this.study();
	//		super.
			//5,静态调用关系? -- 只能调用静态,不能调用非静态的
			System.out.println(name);
	//		study();
			System.out.println("正在敲代码");
		}
	}

三,static代码块
–1,一段被花括号包起来的代码,而且被static修饰
static{…}
–2,位置是在成员位置,也拥有static关键字的特点
–3,测试

package cn.tedu.oop;
 //测试 代码块
 //1,静态代码块:用来初始化项目–位置在成员位置
 //2,执行顺序:
 //类加载时 : 静态代码块
 //实例化时 : 构造代码块 > 构造方法
 //方法调用时 : 局部代码块
 public class Test5_Block {
 public static void main(String[] args) {
 StaticDemo s = new StaticDemo();//先执行构造代码块然后执行构造方法
 s.show();//执行局部代码块
StaticDemo s2 = new StaticDemo();
		}
	}
	class StaticDemo{
		//静态代码块--位置也是在成员位置--用来完成项目的初始化
		//--只加载一次,在类第一次被加载时就跟着一起加载了(类的资源)
		static{
			System.out.println("静态代码块");
		}
		
		//构造代码块--位置是在成员位置--用来提取构造方法的共性
		{
			System.out.println("构造代码块");
		}
		//构造方法
		public StaticDemo() {
			System.out.println("构造方法");
		}
		//局部代码块--位置是在方法里--用来控制变量的作用范围
		public void show() {
			{	
				System.out.println("局部代码块");
			}
		}
	}

四,final关键字
–1,让子类的重写权限变得可控.如果父类的某个方法不让子类重写,可以用final修饰变成最终方法
–2,表示最终的意思.可以修饰类,成员变量,成员方法
–3,测试

package cn.tedu.oop;
 //测试 final关键字
 //1,final 修饰的类是最终的类,不能被继承
 //2,final 修饰的变量,是一个最终的变量,值不能被修改,称之为是常量
 //3,final 修饰的方法,不能被重写
 public class Test6_Final {
 public static void main(String[] args) {
 //创建子类对象测试
 Son s = new Son();
 s.eat();
 // s.sum = 20 ;//final前可以改也能使用
 System.out.println(s.SUM);
 }
 }
 //1,final修饰的类是最终的类,不能被继承–The type Son cannot subclass the final class Father
 //final class Father{
 class Father {
 //3,final 修饰的变量,final用来修饰常量–The final field Father.sum cannot be assigned
 // final int sum = 10 ;
 static final int SUM = 10 ;
 //2,final 修饰的方法,只能用不能被重写–Cannot override the final method from Father
 final public void eat() {
 System.out.println(“Father…eat()”);
 }
 }
 class Son extends Father{
 // //想要改,发生了重写!!
 // public void eat() {
 // System.out.println(“Son…eat()”);
 // }
 }

五,多态
–1,就是指同一个对象,在不同时刻,代表的对象不同.就是指同一个对象的多种形态.
–2,多态的作用 – 用来统一调用标准!!! 一切向父类看齐
–3,好处是 : 做出通用编程,本质上就是不关心具体的子类的类型,屏蔽了子类之间的不同,可以把 子类当做父类来看.
–4,特点
–前提: 继承关系 + 方法的重写
–5,测试

package cn.tedu.oop;
 //测试 多态
 public class Test7_Multi {
 public static void main(String[] args) {
 //创建子类对象测试
 new Dog().eat();//重写前执行父类的,重写后执行子类的
 //创建多态对象测试
 Animal a = new Dog();//口诀1:父类引用 指向 子类对象
 //口诀2:编译看左边,运行看右边
 //编译看左边–是指想要保存成功,向左边也就是 向父类看齐–统一标准!!
 //运行看右边–是指结果向右边看齐也就是看子类的干活结果
 a.eat();//狗吃肉
 // a.test();//test()是子类的特有方法,多态对象只能调用 父类的
 }
 }
 class Animal{
 public void eat() {
 System.out.println(“啥都吃”);
 }
 }
 //1,多态的前提:继承 + 方法重写(方法声明和父类一样)
 class Dog extends Animal{
 public void eat() {
 System.out.println(“狗吃肉”);
 }
 public void test() {
 System.out.println(“test…”);
 }
 }

六,多态的使用
–1,成员变量
–2,成员方法
–3,静态成员
–4,测试

package cn.tedu.oop;
 //测试 多态的使用
 //总结
 //1,多态中,的成员变量 – 用父类的
 //2,多态中,的成员方法 – 用父类的方法声明,用子类的方法体
 //TODO 3,多态中 ,的 静态资源?
 public class Test8_UseMulti {
 public static void main(String[] args) {
 //创建多态对象–父类引用 指向 子类对象
 Fu4 fu = new Zi4();
 //编译看左边,运行看右边
 System.out.println( fu.name );//成员变量用谁的?–父类的
 //多态中,方法声明用–父类的 ,方法体用–子类的(因为重写了)
 fu.show();//成员方法用谁的?–子类的(重写了)
 fu.test();//成员方法用谁的?–父类的(没重写)
 }
 }
 class Fu4{
 String name = “尼古拉斯.赵四” ;
 public void show() {
 System.out.println(“Fu4…show()”);
 }
 final public void test() {//被final了,不让子类重写了!
 System.out.println(“Fu4…test()”);
 }
 }
 class Zi4 extends Fu4{
 String name = “Anglelababa”;
 public void show() {
 System.out.println(“Zi4…show()”);
 }
 }