JAVA知识巩固之二

JAVA知识巩固:

五、对象的转型

1、对象的向上转型:创建一个子类对象,把他当作父类来看待使用。向上转型一定是安全的。

弊端:不能使用子类特有的方法。

格式:父类 对象名 = new 子类();

2、对象的向下转型:将父类对象,还原成为本来的子类对象。想要调用子类特有方法,就得向下转型

格式:子类 对象名 = (子类)父类对象;

注意:在创建时和向下转型时必须是同样的类型,才能向下转型。

比如:

 Animal animal = new Cat();  //本来是猫,向上转型成为动物。也就是多态
 Cat cat = (Cat)animal;  //将父类对象向下转型成为子类对象

思考:拿到一个父类,怎么知道他原先是什么类?然后将其还原了?(如果类型转换错误就发会发生 ClassCastException异常)

解决:使用instanceof类来判断这个父类对象的原先类是不是现在指定的这个类。

 if(animal instanceof Cat){  //如果父类本来就是cat则会返回true
     Cat cat = (Cat)animal;  //将父类向下转型成为原先类
 }else if(animal instanceof Dog){
     Dog dog = (Dog)animal;
 }

六、final关键字

(abstract关键字和final关键字不能同时使用,因为使用了abstract修饰方法,这个方法就必须被子类实现,而使用final关键字修饰的方法是不能被子类拿来用的)

(final写在权限修饰符后面,数据类型前面)

1、用来修饰一个类 public final class 类名{} (太监类,没儿子。。。)

意义:使用了final的类不能有任何的子类(也就是这个类不能被继承),被final修饰的类可以重写父类的方法,但是其自己的方法因其不能被继承,也就无法被覆盖重写。

2、用来修饰一个方法

意义:被final修饰的方法不能被子类覆盖重写

3、作用于局部变量

意义:此局部变量被赋值一次之后,就不能被修改了。一次赋值,终身不变(不变,对于基本类型来说,是指其中的数据值不可改变。对于引用类型来说,是指其指向的地址是不可改变的,但是地址中具体的值是可以进行改变的。

 final int a = 12;  //定义一个final修饰的整型变量,且赋值
 a = 20;  //这是错误的,因为被final修饰的基本类型数据,赋了一次值后,就不能在赋值了
 ​
 //引用类型
 Student st = new Student("张三");
 st = new Student("李四");    //这是重写new了个对象,很显然st中引用的地址是发生了变化
 ​
 final Student st = new Student("王五");  //用final修饰
 st = new Student("张三");  //这样会导致重写重写引用地址,会报错
 st.setName("张三");  //这样对地址中值进行修改,不改变其引用的值  这样就是正确的

4、作用于成员变量

由于成员变量会自动赋初值,所有对成员变量使用了final修饰,就必须进行手动赋值。

对于final修饰的成员变量,要么使用直接赋值,要么通过构造方法赋值。且只能二选一

如果有多个构造方法,必须保证都会对final的成语变量进行赋值

 public class Person {
     private final String name = "张三";  //要么在这赋值
         
     public Person(){    //要么在这赋值,两者必须其只能存在一个
         name = "张三"
     }
     
     public Person(String name){  //如果使用构造方法赋值,且存在多个构造,要保证每个构造都会对name进行赋值
         this.name = name;
     }
 }

 

七、Static关键字

1、作用于成员变量

意义:成员变量使用了static关键字,这类所有的实现都可以直接使用这个成员变量(如果一个数据要被所有对象共享使用的时候,就可以使用static修饰该成员变量)。

访问:可以直接使用 类名.属性名 或 对象.属性名 进行访问(使用对象.属性名调用也是可以,但运行时还是会将对象名自动转换为类名)

 

在方法区有一块静态区专门存储静态的内容

 

2、作用于成员方法

使用了static修饰的方法就便成了静态方法,静态方法不属于对象,而是属于类的。

可以不用创建对象,直接使用类名.方法名来调用。本类的静态方法,可以不用加类名访问

静态方法中只能访问静态的内容,不能访问非静态内容。(原因:因为内存中是先加载静态的内容,后加载非静态的内容。静态在使用非静态内容时,非静态内容还没有加载,所以报错)

静态方法中,不能使用this关键字。(原因:因为this是指被new出来的对象,使用谁的方法调用this就指向谁。静态方法是被类调用的,不是某个对象调用的,所以在静态方法中使用this,this不能指向具体的类,就会报错。且静态方法先加载)

3、静态代码块

当第一次运行这个类时,静态代码块会执行唯一的一次

典型用途:用来一次性的对静态成员变量进行赋值

 

八、权限修饰符

public > protected > default(默认,不写修饰符) > private

 

九、内部类 (内部类的命名:外部类名$内部类名 ,所以在命名时一般不用$)

1、定义:一个类中包含了另一类,那么这个被包含的类就叫做内部类

2、分类:成员内部类、局部内部类(包含匿名内部类)

3、内部类:

注意:内部类可以随意使用外部类,而外部类使用内部类,则需要内部类对象

 public class Body{  // 这是外部类
     
     public class Heart{ //这是内部类,且叫做成员内部类,因为是直接在外部类下面的
         public void beat(){  //这是内部类的成员方法
             System.out.print("我是内部类的成员方法");      
             System.out.print(name);//内部类可以直接使用外部类的成员方法
         }
     }
     
     private String name ="123"; //外部类的成员方法
     
     public void methodBody(){ //这是外部类的成员方法
         System.out.print("我是外部类的成员方法");
     }
 }

使用内部类的方法:

1、间接方式:在外部类的方法当中,使用内部类,然后再调用这个方法来间接运行内部类

2、直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

 //上诉例子创建内部类
 Body.Heart h1 = new Body().new Heart();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值