***1.***类的访问权限不能是private和protected,它的访问权限只能是包访问权限(缺省)和public访问权限。
2.单一设计模式(其实就是将构造函数设为私有的同时在类中创建私有静态对象然后通过静态方法返回),因为是私有静态(静态)对象所以导致的结果就是只有一个对象即使你创建多个引用但是指向的对象还是不变的(对象在堆区的内存是同一个)
下面展示一些 内联代码片。
Soup2 s2 = Soup2.access(); Soup2 s3 = Soup2.access() s2,s3对象的引用实际是同一个 所以一个引用更改成员变量值两个引用都会变(同一个对象也就是同一个空间)
package designmode;
class Soup2{
public int a=10;
public int b =30;
private Soup2(){
System.out.println("Soup2单一的设计模式构造函数");
};
private static Soup2 soup2 = new Soup2();
public static Soup2 access(){
return soup2;
}
}
public class Singleton {
public static void main(String[] args){
Soup2 s2 = Soup2.access();
System.out.println("第一次s2:"+s2.a+" "+s2.b);
Soup2 s3 = Soup2.access();
s3.a = 1;
s3.b = 3;
System.out.println("第一次s3:"+s3.a+" "+s3.b);
System.out.println("第二次s2:"+s2.a+" "+s2.b);
}
}
***3.***手动清理的时候一定要小心,手动清理一定要有自己的方法(手动清理例如窗体的dispose方法一样),当存在继承的时候手动清理就像C++中的析构函数一样要与构造函数返这来,也就是说父类的清理要在子类清理后面。
*4.**覆盖后向上转型变量用的是父类的变量,函数使用的是子类的函数,但是如果子类覆盖的是父类中的private修饰的函数向上转型后使用的不是重载后的函数而是父类的函数。
下面展示一些 内联代码片。
public class FuGaiDeQueXian {
private void f(){System.out.println("private f()!");}
public static void main(String[] args){
FuGaiDeQueXian fuGaiDeQueXian = new Derived();
fuGaiDeQueXian.f();
}
}
class Derived extends FuGaiDeQueXian {
public void f(){System.out.println("public f()!");}
}
5.继承与组合的的使用:组合是当有多个类的时候如果是在某一个类中要使用到前面多个类的功能来实现本类中的功能的时候用组合(不用继承),组合的时候要注意声明类成员变量的时候用的是public还是private,如果是想让别人知道这个类的组成成分的话就用public反之。
继承:如果是继承就是对父类的延展。
6.final方法:A.最开始的作用是将final修饰的方法可以提高运行效率,也就是将方法进行内嵌调用使得运行效率加快但是当final修饰方法代码量巨大的时候运行效率不仅 不会提高反而会降低,最近的java版本的虚拟机会自动检测final方法如果效率低的话就不会进行内嵌使用。B.将方法锁定确保在继承中保持不变,并且不会被覆盖。如果子类中有与
7.private和final关键字:类中所有的private方法都隐式的指定为是final的(也就是说private方法可以简单的认为是final但是 不能被继承子类中没有)final方法是可以被继承的但是不能被重写。回到private上由于无法取用private方法,所以也就无法覆盖它。可以对private方法添加final修饰词,但这并不能给该方法增加任何额外的意义(也就是没有意义所以不用使用final修饰private)。
8.final类:final类是无法被继承的没有子类。由于final类是无法被继承的所以final类中的所有方法都隐式的指定为final的,因为无法进行覆盖他们。所以在final类中给方法添加final修饰词是没有太大的意义的。
9.继承与初始化(static):
一定要注意static和成员变量初始化。
A.先明确成员变量创建引用(如果在声明成员变量的时候赋值的话在创建引用的时候会赋初值int类型是0,在声明的时候没有赋初值的话java自动赋为NULL)是要先于构造函数。
B.static是前期绑定,所有类中的static修饰的东西执行都是在运行完整前执行(比如创建一个static int a =10;会完整的执行a=10不会像A中创建完引用后赋值为零)所以会先于构造函数。
C.static修饰成员变量导致的结果就是运行时就开始前期绑定这些成员变量和函数(简单点就是运行的时候先是执行static修饰的这些成员变量和函数然后在执行非static的代码块)
D.下边能实现这个效果主要还是用到了一个static静态方法。
总结就是:先执行所有的static修饰的东西,然后创建成员变量引用(如果在创建引用的时候赋初值的话就赋一定的值,单纯创建引用的话就赋NULL,记住这个时候没有赋我们指定的初值在构造函数中才会赋)之后再执行构造函数如果有父类的话先执行父类的构造函数,然后在对声明的时候赋初值的成员变量赋原来的值,之后就是按顺序执行下去。(父类也是同样的)
下面展示一些 简单的。
package inheritance_and_initialized;
class Insect{
private int i = 9;
protected int j ;
Insect(){
System.out.println("i = "+i+", j = "+j);
j =51;
}
private static int x1 = PrintInit("this is static inset.x1 initialized!");
public static int PrintInit(String s){
System.out.println(s);
return 47;
}
}
public class InheritanceAndInitialized extends Insect{
private int k = PrintInit(" this is static k Inheritance_And_Initialized initialized!");
public InheritanceAndInitialized(){
System.out.println("k = "+k);
System.out.println("j = "+j);
}
private static int x2 = PrintInit("this is static inset.x2 initialized!");
public static void main(String[] args){
System.out.println("start task!");
InheritanceAndInitialized inheritanceAndInitialized = new InheritanceAndInitialized();
}
}
10.注意static只能调用static方法或者变量,不能调用实例变量或者实例方法。static可以声明类变量(声明的同时赋初值)列如:在类B中声明类变量
private static A a = new A();(声明类A)
以上属于个人理解有误请大家斧正。
记:
2022-07-13
六月十五
壬寅年 虎
丁未月 丁卯日



