首页 > 代码库 > Java学习笔记(二)
Java学习笔记(二)
内部类:
类的继承:一个子类只能继承一个父类,子类又可以被子类继承没有限制(多重继承)。子类继承父类的所有方法与属性(不能继承父类的private方法和属性)。
子类的实例化:首先子类的对象在堆中分配内存,初始化,然后对形参进行赋值,执行构造函数,执行构造函数时判断有无this调用其它的构造函数,若有则执行下去直到顶层,之后直接跳转到子类当前部分,接着执行显示初始化,最后执行子类构造函数自身的代码。若没有this构造函数,则执行super继承的构造方法,直至object类(object类是所有类的顶层父类),之后直接跳转到子类当前部分,接着执行显示初始化,最后执行子类构造函数本身的代码。Super关键字用于表示继承父类的构造方法,写在子类的每个构造方法中,若没有写则默认为super();此时即继承父类的public 类名(){},若父类中此时又恰巧没有public 类名(){},则会报错。若写了super(….);则表示继承父类中的public 类名(…){…}。This和super调用语句不能同时出现在同一个构造方法中,且this()或super()调用语句只能作为构造函数中的第一句出现。
方法重载:在子类中重写的方法名字和父类一致,且只能把方法的访问权限变强即子类中该方法的开放性比父类强。以super.的形式访问父类中的方法。
Final关键字:相当于定义常量;final修饰的类不能被继承,父类中final修饰的方法不能被重载;final修饰的成员变量的初始化只能在两处,一是定义成员变量的时候如public final String name=”hdjfg”;二是在构造方法中,注意要在每一个构造方法中都做初始化;若再加上static修饰,则此时初始化只能在定义的时候而不能再在构造方法中了(构造方法只有在创建了对象时才会执行,而static修饰的常量则没有要求一定要有对象)。
抽象方法:一些不含方法体的方法,根据。抽象类、抽象方法必须用关键字abstract修饰。抽象方法只需声明不需要实现,抽象类不能实例化。含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能实例化,否则依然为抽象类。
Abstract class A
{
Public Int age
Abstract int aa(int x,int y);
Public void bb(int age)
{
}
}
Class B extends A
{
Int aa(int x,int y)(return 2;)//此处重写了父类的抽象方法故该子类不是抽象类了
Public static void main(String[] args)
{
}
}
接口interface:接口可以理解为一种特殊的抽象类,这种抽象类中只包含常量和方法的定义二没有变量和方法的实现。接口中的成员都是public访问类型的,变量都是常量(默认省略public static final),成员方法都是抽象方法(即省略public abstract);可以定义一个新的接口去继承另外一个已有的接口;可以定义一个类用implements关键字去实现一个接口中的所有方法,也可以定义一个抽象类用implements去实现一个接口中定义的部分方法,代码如下。一个类可以继承一个父类的同时实现一个或者多个接口,extends关键字必须位于implements关键字之前。
interface Runner
{
int ID=3;
//此处ID省略public static final
void run();
//此处省略public abstract,成员变量和方法都默认为public
}
interface Animal extends Runner
{
void breathe();
//此处同时继承了Runner中的方法和变量
}
interface Flyer
{
void fly();
}
class Landanimal
{
}
class bird implements Animal
{
public void run()
{
System.out.println("bird is flying");
}
public void breathe()
//继承重写方法时访问权限要更强public
//若此处没有重写breathe方法,则默认继承接口
//中breathe,此时该类必须声明为抽象类
{
System.out.prnitln("bird is breathing");
}
}
class bird1 extends Landanimal implements Flyer,Runner
//此处extends必须在implements前面
{
}
对象的类型转换:对象转换并没有改变它的本质内容内存等,只是改变了声明而已。
class A
{
public void fun1()
{
System.out,println("A is calling");
}
public void fun2()
{
fun1();
}
}
class B extends A
{
public void fun1()
{
System.out.println("B is calling");
}
public void fun3()
{
System.out.println("B fun3 is calling");
}
}
class C
{
public static void main(String[] args)
{
B b=new B();
callA(b);//子类能够自动转换为父类
//A a=b;
//callA(new B());
}
public static void callA(A a)
{
if(a instanceof B)
//判断传过来的a是否是B的实例,是就执行
{
B b=(B)a;
//强制将父类A a转换为子类
b.fun1();
b.fun2();
b.fun3();
}
a.fun1();
a.fun2();
/* a.fun1();
a.fun2();
a.fun3();
若callA方法改成这样会报错,因为a里面没有fun3方法。但是若再把a.fun3()去掉,则不会报错,但此时涉及到多态。即a.fun1()是执行传过来的子类的fun1(),由于子类中没有重写fun2(),故a.fun2()执行的事父类中的fun2(),但是父类中调用的fun1()是子类中的fun1()。
*/
}
}
如果一个类没有说明继承哪个类那它默认继承object类,object类中有一个方法叫equals它是比较两个类的内容(成员变量的值)
代码如下:
class Animal
{
public int age;
public String name;
public Animal(String name,int age)
{
this.age=age;
this.name=name;
System.out.println(this.name+this.age);
}
public static void main(String[] args)
{
Animal A=new Animal("luo",20);
Animal B=new Animal("hao",30);
if(A.equals(B))
{
System.out.println("相等");
}
else
{System.out.println("不相等");}
}
}
匿名内部类:如下代码
interface PCI
{
void start();
void stop();
}
class MainBoard
{
public void usePCICard(PCI p)
{
p.start();
p.stop();
}
}
class Animal
{
public static void main(String[] args)
{
MainBoard mb=new MainBoard();
//PCI相当于抽象类是不能实例化的,故此处
//的意义等于产生一个实现PCI接口类的对象
//class F implement PCI{...}
mb.usePCICard(new PCI()
{
public void start()
{
System.out.println("start");
}
public void stop()
{
System.out.println("stop");
}
});
}
}
Java学习笔记(二)