43java重点概念继承重写重载抽象类接口作用域superthisfinal.docx
《43java重点概念继承重写重载抽象类接口作用域superthisfinal.docx》由会员分享,可在线阅读,更多相关《43java重点概念继承重写重载抽象类接口作用域superthisfinal.docx(14页珍藏版)》请在冰豆网上搜索。
43java重点概念继承重写重载抽象类接口作用域superthisfinal
main方法仅仅是程序的入口,并不需要非得在public类中,或者任何哪一个类中。
类与类之间是并列的同等关系,main方法可以在任意一个类中。
类的三种变量:
实例变量(成员变量)
静态变量
局部变量
publicclassTest
{
publicstaticintage;
publicstaticvoidmain(String[]args)
{
System.out.println(age);
}
publicvoidprint()
{
System.out.println(age);
}
}
**只要不是局部变量,初值可以不给定
---------------------------------
继承:
基准类BaseClass父类
classAnimal{
publicStringname;
publicintage;
publicvoideat()
{
System.out.println(this.name+"正在吃");
}
}
根据不同的动物分类,创建其子类
**当父类在某一些场景满足不了特性的时候,子类就是对其扩展
extends关键字
**子类可以访问父类任意允许访问的资源
**java里面只允许单继承
//多态2(常用的多态)
狗类继承动物类
classDogextendsAnimal
{
}
Dogdog=newDog();
dog.eat();//能调用成功
-----------------------
Animaldog=newDog();?
?
DogisaAnimal
Animaldog=newDog();
dog.swim();//子类的方法不能调用到
Animaldog=newDog();
Dogd=(Dog)dog;
d.swim();//强制类型转换,是因为只有Dog类型才有swim方法
---------------------------------------------------------
一只猫能不能转成一只狗?
Cat和Dog的父类都是Animal,但是没有其他内在联系,不支持强转
如果不同类型之间强转,报类型转换异常:
ClassCastException
--------------------------------------------------------------------------
Strings=null;
s.indexOf("abc");//编译过,但是运行报空指针异常NullPointerException
-----------------------------------------------------------------------------
1、重载(也是一种多态2):
overload;
方法名相同,参数的类型和个数不能一样,返回值类型可以不同。
**默认情况下,100表示整型,所以如果想传入其他数字类型加L
100L-->long
2、重复定义
在同一个类中两个方法的方法名相同,参数的个数和类型也相同,返回值类型可以不同。
-----------------------------------------------------------------------------------
3、重写:
override;
只会发生在继承关系中,方法名,参数完全一致,返回值类型必须和父类相同。
如果重写了方法,如何调用父类的方法呢?
有个关键字super-->代表父类对象名
this---代表子类对象名
Super和this不能定义在静态方法中,因为它们代表的是对象名。
**重写方法作用域不能比原先的小!
!
!
!
!
Protected--------public√
重写的二义性:
Static修饰的方法被实例方法重写,会有二义性;同样,实例方法被static修饰的方法重写,也会产生二义性。
所以static修饰的方法只能被static方法重写。
父类引用指向子类对象:
1.如果父类中的变量和子类中的变量相同,默认调用的是父类中的变量;
2.但是如果父类中的方法和子类中的变量方法(重写),默认调用的是子类中的变量。
------------------------------------------------------------------------------------
publicclassTest{
publicstaticvoidmain(String[]args){
intx=5;
booleanb1=true;
booleanb2=false;
//如果改成X=4,则在java中语法不能通过。
Java和C语言不一样,C语言if后面非0即真(4非0就是真),而java后要么true要么false
if((x==4)&&!
b2)
System.out.print("l");
System.out.print("2");--2
if((b2=true)&&b1)--3
System.out.print("3");
}
}
publicclassA{
publicvoiddoit(){
}
publicStringdoit(){//重复定义错!
!
!
return“a”;
}
publicdoubledoit(intx){
return1.0;
}
}
1、怎么看类加载?
static块,只要类加载到虚拟机,必定会有静态区,所以static的部分一定会被执行
static
{
System.out.println(……);
//在static中写的代码都是静态字段
}
2、如何查看对象已创建?
构造方法
创建对象时必定会调用构造函数,该类以及该类的父类(包含Object类)构造函数在类对象被创建时自动被调用。
创建的原则:
有父才有子,构造方法一一对应
PublicclassA{}
publicclassBextendsA{};
1、A(){}----------------B(){}//系统自动生成,默认自动子继父。
2、重写构造方法
A(){}----------------B(){}//保留无参构造,保留的无参构造函数系统还会默认子继父,可以不用super。
A(T1){}--------------B(T1)){superA(T1)}//重写构造函数后,需手动子继父;
默认情况下,有系统自动有一个无参构造方法,为了初始化所以有时需要定义有参构造方法,但是重写构造方法后原来默认的无参构造方法不将存在,最好手动再写一遍无参构造方法,方便对象的创建,父基类重写构造方法后系统默认的父子自动承建关系就会断了,所以在子类需要重写相应的构造方法,并且手动构造父类构造方法!
!
Dogd=newDog(20);
**如果只有有参构造,新建对象的时候就不能使用无参构造方式
**如果希望使用无参构造方式创建对象,一定要保留无参构造
**构造方法也是有重载;
-----------------------------------------------------------------------------------------------
publicclassA{
publicstaticvoidtest()
{
System.out.println("testA...");
}
}
publicclassBextendsA{
}
**static修饰的方法被重写的时候,也只能是static的,否则会报错。
**父类是实例方法,子类的重写不能是static
**只有方法才有重载和重写,变量没有!
!
!
-------------------------------------------------------------------------------------------------
classA{
publicinti=10;
}
classBextendsA{
}
Bb=newB();
System.out.println(b.i);--10因为可以引用父类的资源
---------------------------------------
classA{
publicinti=10;
}
classBextendsA{
publicinti=20;
}
Bb=newB();
System.out.println(b.i);20
Aa=b;
System.out.println(a.i);10
**Aa=b;会根据A类型去找对应的实例变量
classA
{
publicstaticintj=100;
}
classBextendsA
{
}
Bb=newB();
System.out.println(b.j);-->100
Aa=b;
System.out.println(a.j);-->100
classA
{
publicstaticintj=100;
}
classBextendsA
{
publicstaticintj=200;
}
Bb=newB();
System.out.println(b.j);-->200B.j
Aa=b;
System.out.println(a.j);-->100A.j
-----------------------------------------
Java的三大特性:
封装继承多态
----------------------------------------
javaIDE(java集成开发环境)常见的几种:
NetBeans
Eclipse
MyEclipse-->Eclipse商业版
工作区(workspaces):
包含很多个JAVA工程(包含很多JAVA源代码)
里面有两个目录:
bin:
存放编译好的.class文件
Src:
存放java源文件.java
-----------------------------------------------------------
作用域
本类同包子孙类其他位置
public****
protected***//子类权限
friendly(不写)**//包权限
private*//类权限
方便记忆的顺序:
private(类权限)、protected(子类权限)
Friendly(包权限)
---------------------------------------------------------------------------------------------------------------------------
包:
package
类型:
Strings="abc"等价于java.lang.Strings="abc"
Java.lang包由jdk自动默认导入,所以在使用java.lang包里面的类时不需要写全包名。
其他包手动导入才能不写全包名直接使用,否则需要写全包名。
---------------------------------
this
super
public
private
protected
class
static
----------------------------------------------------------------------------------------------------------------
final关键字
final能修饰类,变量,方法
如果使用final修饰,表示值不能变化
1、final修饰类:
表示该类不能被继承
2、final修饰变量:
变量值只能被赋值一次
3、final修饰方法:
该方法不能被重写
**如何创建一个常量PIpublicstaticfinaldoublePI=3.14
Static规定了该变量只能在内存中存在一份;
Final规定了该变量只能被赋值,不能被修改。
----------------------------------------------------------------------------------------------------------
**所有类的父类是java.lang.Object
Object类中三个常见的方法:
toString():
打印对象,System.out.println(b1),结果是该对象在内存中的位置;一般需要重写
equals():
比较对象的内容是否相等。
b1.equals(b2);
b1==b2:
比较的是两个对象的地址是否相等,而不是实体。
hashcode():
返回对象的hash值,作为对象的唯一标识。
Clone():
复制一个对象。
------------------------------------------------------------------------------
遛狗原理
publicclassPerson{
privateStringname;
privateintage;
}
Objectp=newPerson();//new出一个对象A用p指向
p=newPerson();//又new出一个对象B用p指向,则对象A将没有引用指向,成为疯狗(一块没有意义的内存区域)。
System.gc();-->系统垃圾回收。
可以手动调用,如果不手工调用JVM在一定时间后也会自动调用垃圾回收机制,处理疯狗。
遛狗原理的应用:
1、在大量引用类型数据被循环复制的时候,遛狗原理能显著的提到性能。
它通过改变引用,使引用类型原来指向的对象成为疯狗,能及时被java的内存机制回收。
2、JAVA内存回收机制
垃圾回收的时候,如果对象被回收,那么finalize()一定会被调用,这可以查看一个对象是否被回收,重写finalize()。
3、建立一个集合List(在一个数组中存放多种数据类型),灵活使用遛狗原理和Object。
Object和BigDecimal(任意精度的十进制数)的关系(中间件,可以向其它类型强制转换)。
练习:
1、如何使一个数组既可以保存String,Person,int,long?
?
Object[]arr=newObject[10];
2、保存每一个对象到arr中,希望实现容量无上限?
?
a.重新创建一个数组比原来的更大
b.原来的数据得保存进来,新的数据也保存进来
publicclassTList{
privateintcount=4;
privateintcurrent_index=0;
privateObject[]arr=newObject[4];
publicvoidpush(Objecto)
{
//考虑下标如果越界怎么办?
if(current_index>=count)
{
Object[]arr2=newObject[count*2];
//原来的数据要保存进来
for(inti=0;i{
arr2[i]=arr[i];
}
//当前的篮子要指向正确的对象
arr=arr2;//遛狗原理
count=arr.length;
}
arr[current_index]=o;
current_index++;
}
publicObjectget(intindex)
{
returnarr[index];
}
}
TListlist=newTList();
Strings="abc";
list.push(s);
Stringo=(String)list.get(0);//父类向子类类型转换,需要强制类型转换
o.charAt
(2);
----------------------
数组不适合大数据量的删除操作
----------------------------------------------------------------------------------------------------------
普通类、抽象类、接口的区别:
对用户的自由开发代码的权限程度不同
普通类:
不用自己编写,直接引入类创建对象实例化;
抽象类:
部分方法是抽象类,需要根据自己的需求实现;
接口:
所有的方法都是抽象类,全部都要自己来实现。
抽象类:
将一系列比较公共的特性放到单独的一个类里面,抽象类中可以有抽象方法、实现方法、和实例变量。
抽象方法不需要实现,只需要声明。
举例:
做一个开户,转账
init();
doBusiness();
destroy();
publicabstractclassBusiness{//抽象类
publicabstractvoidinit();//抽象方法
publicvoidtest()
{
......
}
}
publicclassNewSubscriberextendsBusiness{
publicvoidinit(){
....1234
}
}
publicclassTransferextendsBusiness{
}
**抽象类和普通类有什么区别?
1、抽象类可以有抽象方法,普通类不行
2、普通类可以自定义创建对象,但是抽象类不能创建对象。
抽象类和普通类的共同点?
1、都可以有实现方法
千万不要在抽象类上面加final,private修饰,因为抽象类需要被子类继承,并且实现抽象类中的抽象方法。
---------------------------------------------------------------------------------------------------------------
接口:
定义一系列的标准,抽象出来,它比抽象类更加抽象。
**接口里面不能有实现方法,必须全部都是抽象方法,所有的变量都是常量
publicinterfaceT1{
publicinti=10;//publicstaticfinalinti=10;
publicvoidtest();//publicabstractvoidtest();
}
接口中的所有变量都被JVM默认修饰为staticfinal类型,所有的变量都是常量;
接口中的所有方法都被JVM默认修饰为abstract类型,所有的方法都是抽象方法。
需要实现接口
publicclassTimplementsT1,T2,T3….//多实现
{
//必须实现所有的抽象方法
}
**抽象类和接口的区别?
抽象类里面可以有实现方法,接口不行
抽象类可以有实例变量,接口不行,接口里面都是常量
java支持多实现,但是只支持单继承!
!
!
!
---------------------------------------------
Myeclipse的调试方式: