java学习笔记(雍俊海)

时间:2023-02-25 14:22:34

一、类

java学习笔记(雍俊海)

当父类有私有的方法和属性,子类是继承不到的,所以子类不能访问父类的私有方法和属性。

java 特性,private:类中只要限定为private的成员,只能被这个类本身访问

追问:
private保护控制在类的级别上,而不是对象的级别这个我知道。我就想知道,子类到底是继承到父类的私有的了没?
回答:

没有继承,父类的任何私有方法和属性,子类是继承不到的。


JAVA父类对象与子类对象-造型转换


描述1: Java中子类对象可以直接赋给父类对象,这个时候父类对象引用的就是子类对象的内存空间。如:
class A {
    ……
}
 
class B extends A {      
        ……
}
则可以:
      B b=new B();
      A a=b;//正确
父类对象a引用了子类对象b指向的内存空间。
或者可以直接:A a=new B();//正确

描述2:Java中将父类对象赋给子类对象时,要进行强制类型转换
例如:
class People
{
   int id;
   String name;

   People(){

   }

   People(int id,String name){
        this.id=id;
        this.name=name;
   }
}

class Student extends People
{
     float score;
     Student(){

     }

     Student(int id,String name,float score){
         this.id=id;
         this.name=name;
         this.score=score;
    }
}
public class hello{
     public static void main(String[] args){
           Student stu=new Student(1,"jj",88);
  
           People p=new People(3,"cc");
           stu=(Student)p;//父类对象造型转换后赋给子类
          System.out.println(stu.id);
    }
}
上面的源程序可以同过编译,但在解释执行时会抛出class castException异常。
这是因为:可以执行类型转换“子=(子)父”,但需要运行时进行检查。如果父类变量引用的是正确的子类型(这句话的意思即为描述1中的内容:即父类对象要想强制转换后赋给子类对象,其本身引用的是子类型的内存空间),赋值将执行。如果父类变量引用的是不相关的子类型,将会生成class castException异常。

描述3:将描述2的源代码改为下面的形式,在运行时就不会抛出class castException异常了。


class People
{
   int id;
  String name;
  People(){
  }
  People(int id,String name){
      this.id=id;
     this.name=name;
  }
}
class Student extends People{
   float score;
   Student(){
   }
   Student(int id,String name,float score){
      this.id=id;
      this.name=name;
      this.score=score;
   }
}
public class hello {
   public static void main(String[] args){
      Student stu=new Student(1,"jj",88);
  
      People p=new Student(3,"cc",99);
      stu=(Student)p;
      System.out.println(stu.id);
   }
}
总结:

对类进行造型转换的应参考以下原则:
1.总是可以“父=子”赋值。此时不需要类型转换。
2.可以执行类型转换“子=(子)父”,但需要运行时进行检查。如果父类变量引用的是正确的子类型,赋值将执行。如果父类变量引用的是不相关的子类型,将会生成class castException异常。
   即:如果父类的实例是在子类的实例上塑造的,“子=(子)父”时就不会抛出异常。  
   如:
    A 是B的父类。
    A a= new B(); //父类A的对象a是在子类B的对象上塑造的。
   就可以:
   B b= (B)a;
3.决不能在不相关的任何类之间执行类的赋值或者类型转换。即类的强制转换仅限于有继承关系的俩个类的对象之间。