一.四种权限修饰符
二.类及其组成所使用的常见修饰符
1.修饰符:
- 权限修饰符:private,默认的,protected,public
- 状态修饰符:static,final
- 抽象修饰符:abstract
2.类:
- 权限修饰符:默认修饰符,public
- 状态修饰符:final
抽象修饰符:abstract
用的最多的就是:public
3.成员变量:
- 权限修饰符:private,默认的,protected,public
状态修饰符:static,final
用的最多的就是:private
4.构造方法:
权限修饰符:private,默认的,protected,public
用的最多的就是:public
5.成员方法:
- 权限修饰符:private,默认的,protected,public
- 状态修饰符:static,final
- 抽象修饰符:abstract
6.组合规则:
成员变量:public static final
成员方法:
public static
public abstract
public final
三.内部类(主要应付面试)
内部类有四种:成员内部类、局部内部类、匿名内部类和静态内部类
1.内部类访问特点
- a:内部类可以直接访问外部类的成员,包括私有。
b:外部类要访问内部类的成员,必须创建对象。
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
class Draw { //内部类
public void drawSahpe() {
System.out.println("半径为:"+radius);
System.out.println("drawshape");
}
}
public static void main(String[] args) {
Circle.Draw draw = new Circle(4).new Draw();
draw.drawSahpe();
}
}
2.成员内部类
a.看成外部类的一个成员
b.访问同名的成员变量或者方法时:
- 外部类.this.成员变量
- 外部类.this.成员方法
3.成员内部类私有使用
4.成员内部类的面试题
要求:使用已知的变量,在控制台输出30,20,10。
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
public class Ti11 {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
5.局部内部类访问局部变量的问题
a.局部内部类访问局部变量必须用final修饰
b.局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
但是jdk1.8取消了这个事情,所以我认为这是个bug
c.局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
public class Local {
public static void main(String[] args) {
print();
}
public static void print(){
final int b = 4;
class Car{
int a = 5;
public void out(){
System.out.println(a+" "+b);
}
}
Car car = new Car();
car.out();
}
}
6.匿名内部类的格式和理解
a.匿名内部类在开发中的应用
public class Ti15 {
public static void main(String[] args) {
PersonDemo pd = new PersonDemo();
pd.method(new Person(){
public void show(){
System.out.println("匿名内部类");
}
});
}
}
abstract class Person{
public abstract void show();
}
class PersonDemo{
public void method(Person p){
p.show();
}
}
b.匿名内部类的面试题
interface Inter { void show(); }
class Outer { //补齐代码 }
class OuterDemo {
public static void main(String[] args) {
Outer.method().show();
}
}
要求在控制台输出”HelloWorld”
public class Ti16 {
public static void main(String[] args) {
Out.method().show();
}
}
interface Inter {
void show();
}
class Out {
//匿名成员内部类
/*public static Inter method(){
return new Inter() {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("a");
}
};
}*/
//成员内部类
/*class InterImp implements Inter{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("成员内部类");
}
}
public static Inter method(){
InterImp imp = new Out().new InterImp();
return imp;
}*/
/*static class InterImp implements Inter{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("静态成员内部类");
}
}
public static Inter method(){
InterImp imp = new Out.InterImp();
return imp;
}*/
//局部内部类
public static Inter method(){
class InterImpl implements Inter{
public void show(){System.out.println("局部内部类");};
}
return new InterImpl();
}
}