📄 java4.txt
字号:
重写和多态没有必然联系,但二者都是基于继承的前提下的两个不同概念重写的好处:父类不满足子类的需求,或者对于子类来说是错误的方法会被重写屏蔽掉,保证方法调用的时候的对于子类的正确性多态:类多态:父类变量指向子类对象,发生类多态1.只能使用父类中定义的属性/方法,不能使用子类中定义的,除非进行类型转换2.重写的方法可以调用,但是实际调用的是子类的重写后的方法,覆盖掉了父类中的方法3.如果没有继承,就没有重写,如果在父类中把方法设为 private ,那showName()方法就不能重写,也就会报错,如果想要使用子类的showName()方法,可以把 @Override 去掉,使子类中的showName()成为一个新方法Chapter 6Java 语言高级特性static 关键字静态可以用于方法,属性,语句,内部类只要加了static 就会提升到类级别,也就是类相关static 属性/方法依赖类,不依赖对象,可以使用类名.调用(可以使用对象名调用,但最好使用类名调用,使可读性增强,知道是调用static )1.static 方法当中只允许操作static 属性,不能操作非static 属性2.static 属性中可以在任意方法中使用3.this super 不能在static 方法中出现--------------------------------------------------------------------------------------package com.tarena.day04.sta;public class TestCount { private static int count1 = 0; private int count2 = 0; static{ //static修饰语句块,在类加载的时候调用 System.out.println("static"); } public TestCount(){ count1++; count2++; } public static void test(){ count1 = 2; //可以给静态属性赋值 //count2 = 3; 静态方法中只能有静态属性 //this.count 静态方法中不能有this和super关键字 } public static void main(String[] args) { System.out.println("begin"); TestCount tc1 = new TestCount(); System.out.println("end"); TestCount tc2 = new TestCount(); System.out.println(tc1.count2); System.out.println(tc2.count1); //应该用TestCount.count1 }}输出结果:staticbegintestcountendtestcount12--------------------------------------------------------------------------------------package com.tarena.day04.sta;public class Test { /** * @param args */ public static void main(String[] args) { System.out.println("begin"); TestCount tc1 = new TestCount(); System.out.println("end"); TestCount tc2 = new TestCount(); }}输出结果:beginstatictestcountendtestcount--------------------------------------------------------------------------------------上面个2个例子中说明,想要执行main方法一定要先加载本类,所以第一个TestCount中先执行static 语句块的内容,所以输出结果static 在第一个而在Test中的main方法是在其他类中调用TestCount类,所以在new 的时候才会显示 static ,所以static 会在第二个出现--------------------------------------------------------------------------------------package com.tarena.day04.sta;public class Test { public static void main(String[] args) { TestCount tc1; //声明的时候不加载类 //TestCount.test(); 类名. 静态方法 的时候会加载类,所以如果写这句这里会显示static System.out.println("begin"); tc1 = new TestCount(); //只有在new的时候才会加载类,这时候才会显示static System.out.println("end"); TestCount tc2 = new TestCount(); }}--------------------------------------------------------------------------------------声明的时候不加载类,只有在用new 或 类名.静态方法 的时候才会加载类,这时候会把静态成员函数填入池中把.class 文件加载到内存中称为类加载,由CLASSPATH中找类文件--------------------------------------------------------------------------------------package com.tarena.day04.sta;public class Person { static{ System.out.println("person static"); } { System.out.println("person not static"); } public Person(){ System.out.println("person"); }}--------------------------------------------------------------------------------------package com.tarena.day04.sta;public class Student extends Person{ static{ System.out.println("student static"); } { System.out.println("student not static"); } public Student(){ System.out.println("student"); } public static void main(String[] args) { new Student(); //加载子类的时候一定会先加载父类 }}输出结果:person staticstudent staticperson not staticpersonstudent not staticstudent--------------------------------------------------------------------------------------上面的例子说明,加载子类的时候一定会先加载父类,所以在加载的时候会先显示person static ,然后再加载子类,会显示student static,再从父类中的按语句块,构造的顺序执行,最后执行子类中的语句块,构造由父到子的过程是特化,由子到父的过程叫泛化。单例设计模式:--------------------------------------------------------------------------------------package com.tarena.day04.sta;public class Singleton { //单例 private static Singleton sin;// = new Singleton(); 饿汉式生成,//由于是静态的,所以可以保证在类加载的时候运行一次 private Singleton(){} public static Singleton getInstance(){ //直接返回sin if(sin==null){ sin = new Singleton();//懒汉式生成,节省内存,在需要的时候再生成 } return sin; }}--------------------------------------------------------------------------------------package com.tarena.day04.sta;public class TestSingleton { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1==s2); //true }}--------------------------------------------------------------------------------------final 可用于类,方法,属性1.final 的类是无法继承的2.final 方法无法重写/覆盖3.final 只能赋值一次--------------------------------------------------------------------------------------package com.tarena.day04.fin;public class TestFinal { private final int t; //只用final不一定是常量,只是不能对它二次赋值 private final Person p = new Person();//final变量(p)的方法和属性(age)不一定是final的 public TestFinal(){ t = (int)(Math.random()*86); p.setAge(t); p.setAge(t+1); System.out.println(t); } //final的变量必须显式赋值,位置可以是声明/构造/语句块 public void set(int i){ //t = i; //同一对象方法可以被多次调用,所以不能在这里给一个final变量赋值 } public static void main(String[] args) { TestFinal tf1 = new TestFinal(); TestFinal tf2 = new TestFinal(); }}class Person{ private int age; public void setAge(int age){ this.age = age; } public int getAge(){ return age; } }--------------------------------------------------------------------------------------作业:1.复习和总结概念2.把所有代码看懂,自己敲出来.3.写一个日期类,要求有年月日。要能区分闰年,要求按照封装等概念来做,要求写两个构造,一个无参,一个带三个参数int4.写一个教室类,有学生/老师/网管学生有多人,要求:学生人数在开班的时候要确定,不可改变,老师是所有教室共享的,管理员要求常量(类/对象/属性/方法/构造/封装/继承/多态/final/static)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -