面向对象总结

接口Teaching(包含方法: 备课prepareLessons,上课teach,批改作业homeworkCorrecting,…)
接口Sports (包含方法: 跑步running, 打球playBall,…)
接口Drinking(包含方法: drink, throwup,playMad,…)
抽象类Person(包含抽象方法:getMoney,…)
子类(实现类)Student,Teacher…
使用三种多态方式,虚方法调用,对象类型判断,对象造型,重写equals方法,重写toString方法
1.使用关键字final来修饰类、属性和方法时,分别有什么特点?
1.修饰类:
当用final修饰一个类时,表明这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
在使用final修饰类的时候,要注意谨慎选择,除非这个类真 的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
2.修饰方法
使用final方法的原因有两个,第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率,在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。
因此,如果只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
3.修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
2.final能否修饰方法的形参?能否修饰方法体内的局部变量?如果能,被修饰的变量有什么特点?
1.final修饰形参不能被赋值,因为形参在调用该方法时,由系统传入的参数来完成初始化。
2.系统不会对局部变量进行初始化,必须由程序员显式初始化。如果在定义final变量时没有指定初始值,则可以在后面的代码中进行对final变量赋初始值,但只能一次,不能重复赋值,如果final修饰的局部变量在定义时已经制定默认值,则后面的代码中不能再对该变量赋值。
3.构造方法能否用final来修饰?
不能,构造器不是通过继承得到的,子类不会继承父类的构造方法,所以没有必要把它声明为final的。
4.含有抽象方法的类一定要声明为抽象类吗?抽象方法的声明格式?
含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
抽象方法声明格式:[修饰符] abstract 返回值类型 方法名([形式参数表]);
5.抽象类里面一定会包含抽象方法吗?抽象类里面一定会有具体方法吗?
抽象类中可以没有抽象方法,但是如果一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
抽象类中可以有非抽象方法。
6.能否创建抽象类的引用?能否创建抽象类的对象?
不能实例化抽象类的对象,但可以创建抽象类的引用。
Student s;//类的引用
Student s=new Student(); //创建类的对象
7.抽象类能否作为方法的形参?能否作为方法的返回值类型?
抽象类可以作为方法的形参类型, 抽象类可以用静态方法返回该抽象类的引用,在方法中,利用内部类(最好为匿名)来实现抽象的方法。
public abstract class A {
public abstract void a() ;
public static A getInstance()
{
return new A()
{
// 匿名内部类,相当于new一个A的子类实例
public void a()
{
// 空实现
}
};
}
}
8.构造方法,静态方法,public方法,protected方法,default方法,private方法,final方法能不能被声明为抽象的方法?
构造方法不能被声明为抽象的方法 。
静态方法不能被声明为抽象的方法,一个类可以有多个实例对象,但只有一个静态对象,也就是类本身,类是可以被继承的。但它的静态对象只有一个,不能被继承,他的静态方法更不可能被继承。所以,抽象方法是需要继承来实现,而静态方法根本不能被继承 ,两者互相矛盾。所以,根本就不存在抽象静态方法。
public方法可以被声明为抽象的方法。
protected方法可以被声明为抽象的方法。
default方法可以被声明为抽象的方法。
abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法永远不会有发方法体,因此abstract方法不能定义为private访问权限。
final方法不可以被声明为抽象的方法。
9.属性能否用abstract来修饰?
abstract不能用于修饰属性。
10.抽象类中可以有构造方法吗?
可以
11.抽象类中可以有static方法吗?
在抽象方法声明中使用static修饰符是错误的。
可以有static方法。
12.static可以修饰host宿主类吗?final呢?abstract呢?
static不能修饰host宿主类
final可以修饰host宿主类
abstract可以修饰host宿主类
13.接口声明的关键字是(interface),它是(public、默认的)修饰的方法和(public、static、final)修饰的常量值组成的一个数据结构。
14.多个类可以实现同一个接口吗?一个类可以实现多个接口?一个接口可以继承多个接口吗?一个类可以继承多个父类吗?
多个类可以实现同一个接口,一个类可以实现多个接口,一个接口可以实现多个接口,一个类只能有一个直接的父类。
15.与继承关系类似,接口与实现类之间存在( 多态性 ).
16.定义java类的完整语法格式
修饰符 class 类名{
程序代码
}
现在我们来写一个简单地Java程序HelloWorld程序,代码如下:
public class HelloWorld
{
//定义一个名为HelloWorld的类
public static void main(String[] args)
{
//定义一个main()方法,也就是程序执行的主入口
System.out.println(“这是第一个Java程序!”);//程序输出语句
}
}
17.接口里可以没有任何属性,方法的定义吗?
可以
18.接口里有构造方法吗?可以有非抽象的方法吗?
接口没有构造方法,因为接口只有定义,没有实现。
接口不能有非抽象的方法,默认的是public abstract。
19.如果所有方法都没有实现,优先使用( 接口);一些方法已经可以实现,而另一些方法无法或不想实现时,且继承(实现)关系很简单时,优先考虑使用(抽象类 );
20.一个类可以继承(extends)多个接口吗?
一个类可以实现多个接口。
21.接口可以继承一个类吗?
一个接口可以继承一个类。
22.内部类可以访问外部类所有属性吗?
非静态内部类可以访问外部类的所有属性。
静态内部类不可以直接访问外部类的静态属性(就是Static 修饰的属性),必须实例化,然后用该对象去引用。
23.内部类的访问控制权限可以有哪些?
内部类可以访问外部类的任何成员,包括private成员。
外部类访问内部类的成员需要创建内部类的对象,之后可以访问内部类的任何成员,包括private成员,需要注意的是成员内部类不可以有静态成员。
当外部类的成员和内部类的成员重名时单单用this是区分不了的。在内部类中访问外部类的成员时可以用如下语法区分
<外部类类名>.this.<外部类中需要被访问的成员名>;
24.内部类的名字能不能与宿主类的类名相同?
不能
25.非静态内部类是否可以使用宿主类的静态和实例成员变量?
局部内部类和成员内部类一样可以访问外围类的所有成员,但是不可以访问同在一个局部块的普通局部变量。如果要访问,此局部变量要被声明称final的。
26.在宿主类Outer之外例如Client.java中实例化成员内部类Inner的格式:
外部类之外创建成员内部类对象
既然是外部类的非静态成员,就必须在外部类对象存在的情况下使用。
基本语法是
<外部类类名>.<内部类类名> 引用变量名称 = <外部类对象的引用>.new <内部类构造器>;
<外部类类名>.<内部类类名> 引用变量名称 = new <外部类构造器>.new <内部类构造器>;
(1)、创建内部类对象时对象引用必须是<外部类类名>.<内部类类名>
(2)、调用内部类的构造方法不能直接用new 而是要用<外部类对象的引用>.new调用
例子:
class Outter
{
//非静态内部类
class Inner
{
//内部类成员
int i = 12;
public void innerTest()
{
System.out.println(“Inner Class Method”);
}
}
//外部类的普通成员
int j = 0;
}
class MainTest
{
public static void main(String[] args)
{
Outter outter = new Outter();
Outter.Inner inner = outter.new Inner();
inner.innerTest();
}
}
在外部类之外访问内部类时需要注意权限修饰符的限制,这点和类成员一样。
27.在宿主类Outer内部实例化成员内部类Inner的格式:(1)在main方法中;(2)在非静态方法中
外部类之内创建成员内部类对象
语法和普通的创建对象相同,用new操作符调用相应的构造方法即可。注意的是,非静态内部类属于外部类的非静态成员,不能在静态上下文使用。
例子:
class Outter
{
//非静态内部类
class Inner
{
//内部类成员
int i = 12;
public void innerTest()
{
System.out.println(“Inner Class Method”);
}
}
//外部类的普通成员
int j = 0;
public void test()
{
Inner inner = new Inner();
inner.innerTest();
}
}
28.private成员内部类中的private属性,在宿主类中能否访问到?在宿主类之外能否访问到?
在同一个类中是可以直接访问的。如果在其他类的话,正常情况下,私有属性是无法访问的
29.在成员内部类中是否可以定义static final的属性?是否可以单独用static修饰?
内部类的对象:脱离了其外围类的对象就不会存在。
静态变量:作用是让该类的所有对象共享一个状态。
原因分析:
因为你的内部类是非静态的,除了要依靠外部类实例外,还要依赖内部类实例。
而静态变量是不需要构建类实例的,两者是相矛盾的。
而final类型修饰的变量(即常量)可以离开类实例存活一段时间的。
所以final修饰过的不错。
你如果把内部类修饰成静态的就不会报错了。
综上所述:出现这种情况的主要原因,是外部类实例与内部类实例依赖问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值