2021年1月30日10点17分
JAVA自学课程笔记3:
static:
静态成员属于类本身,不属于对象,被类的所有对象共有。不创建对象也可以使用。(类似于C的static变量)。
静态成员不能访问非静态成员:
class A{
public int i = 10;
static int j = 20;
public static void f(){
i = 99 //error
j = 88 //OK
}
}
获得引用对象次数:
class A{
private int i;
private static int cnt = 0;
public A(){
++cnt;
}
public A(int i){
this.i = i;
++cnt;
}
public static int getCnt(){
return this.cnt;
}
}
只有静态非私有方法才可以通过类名的方法访问,System.out.print()方法中print()方法、System.arraycopy()方法中的arraycopy()方法就是静态非私有方法。
继承(extends):
语法:class 子类(派生类) extends 父类(基类)。
为多态创造条件。
private成员不能被继承。但其在物理上被继承了过来,逻辑上程序员无法访问。因此有可能造成内存浪费。
子类的普通方法中不能用super()调用父类的构造方法,要在子类的构造方法中才能调用。
每个子类构造方法的第一条语句中,都是隐含地调用super()。
当父类有多个构造函数时,super()只调用其中一个。
方法重写:
若一父类a中含有的方法f()被子类b继承了,同时在子类b中创建了同名的方法成员f(),则视为方法重写。
且不能原先父类中的被覆盖的方法f()访问权限更严格(访问控制符等级不能下降)。
如:原先父类a中为public void f()在子类b中重写不能重写为protected void f()。这是为了能使多态在任意情况下能实现(之后的内容)。
多态(polymorphism:poly):
在继承的基础上,有子类和父类。子类可以赋值给父类,反过来不行,因为子类是父类的一种(子类可以当作父类看待)。
class A{
}
class B extends A{
}
public class Test1{
public static void main(String[] args){
B bb = new B();
A aa = new A();
aa = bb;
}
}
且通过被赋值的父类引用只能访问子类从父类继承过来的成员,而不能访问子类特有的成员。
class A{
public void f(){}
}
class B extends A{
public void f(){}
public void g(){}
}
public class Test1{
public static void main(String[] args){
B bb = new B();
A aa = new A();
aa = bb;
aa.f(); //OK
//aa.g(); //error
}
}
相同系谱,不同对象,一个方法,不同结果。
class A{
public void f(){
System.out.println("AAA");
}
}
class B extends A{
public void f(){
System.out.println("BBB");
}
}
public class Test2{
public static void g(A aa){
aa.f();
}
public static void main(String[] args){
A aa = new A();
B bb = new B();
g(aa);
g(bb);
}
}
//运行结果:
AAA
BBB
抽象(abstract)
没有方法体的方法叫做抽象方法,抽象方法要求末尾加分号,并定义为abstract。
若一个类中出现了抽象的属性成员,那该类必须更改为抽象类。抽象类中可以包含非抽象成员。父类非抽象,子类可以是抽象的(无实际意义)。
定义一个抽象父类后,要使非抽象子类能继承该父类,则子类必须实现父类中的抽象成员(必须重写父类的抽象成员,因为子类继承了父类的抽象方法而子类又非抽象类)。
abstract class A{
abstract public void f();
int i = 3;
}
class B extends A{
public void f(){
}
}
public class Test3{
public static void main(String[] args){
}
}
定义一个抽象父类后,要使子类能继承该父类,则子类必须为抽象类。
abstract class A{
abstract public void f();
int i = 3;
}
abstract class B extends A{
}
public class Test4{
public static void main(String[] args){
}
}
对于一个抽象类,仅可以定义其一个抽象类的引用,不能定义一个对象。
abstract class A{
abstract public void f();
int i = 3;
}
class B extends A{
public void f(){
System.out.println("BBBB");
}
}
public class Test5{
public static void main(String[] args){
//A aa = new A(); //error
B bb = new B(); //OK
bb.f(); //OK
A aa; //OK
}
}
运用多态的方法,可以把抽象类给变实现。
abstract class A{
abstract public void f();
int i = 3;
}
class B extends A{
public void f(){
System.out.println("BBBB");
}
}
public class Test6{
public static void main(String[] args){
//A aa = new A(); //error
B bb = new B(); //OK
bb.f(); //OK
A aa; //OK
aa = bb;
aa.f();
}
}
//输出结果:
BBBB
BBBB
Final:
final修饰类则表示该类不可被继承。
final修饰的属性必须被赋值且只能赋一次值。final定义变量后,变量即为常变量,不可再次赋值(类似于C的const(n.)(constant adj.))。若想定义后赋值,则必须通过其类的构造方法。
class A{
final public int i;
public A(int i){
this.i = i;
}
}
public class Test7{
public static void main(String[] args){
A aa = new A(63);
System.out.println(aa.i);
}
}
但若是final变量被初始化了,则无法再进行赋值。
class A{
final public int i = 63;
public A(int i){
//this.i = i; //error
}
}
public class Test8{
public static void main(String[] args){
A aa = new A(63);
System.out.println(aa.i);
}
}
final修饰的方法可以被继承,但不能被重写。
JAVA自学课程笔记3
最新推荐文章于 2024-09-15 09:47:04 发布
这篇博客介绍了Java编程中的关键概念,包括静态成员的特性,如何通过类名访问静态非私有方法,以及继承、多态和抽象的原理。在继承中详细阐述了子类与父类的关系,方法重写和抽象类的使用规则。此外,还讨论了final关键字的作用,即防止类被继承和变量被重新赋值。
摘要由CSDN通过智能技术生成