对象的转型,抽象类,包的访问权限



对象的转型分为:向上转型和向下转型。 
一.对象的转型 
1.1什么是向上型转型? 
向上转型—将子类的对象赋值给父类的引用。 
Student s = new Student(); 
Person p = s; 
 
具体看以下的代码: 
public class Person { 
String name; 
int age; 
void introduce(){ 
System.out.println(“姓名:”+name+”年龄:”+age); 


public class Student extends Person{ 
String address; 
void study(){ 
System.out.println(“我正在学习”); 

void introduce(){ 
super.introduce(); 
System.out.println(“我的家在:”+address); 


/* 
一个引用能够调用哪一个方法,取决于这个引用所指向的对象; 
一个引用能够调用哪些成员变量和成员函数,取决于这个引用的类型; 

public class Test { 
public static void main(String[] args) { 
Student s = new Student(); 
Person p = s; 
p.name= “Jack”; 
p.age =20; 
// p.address = “北京”;//p的引用只能调用父类中的所涵盖的成员变量 
//p.study();//在父类中无study方法体; 
p.introduce(); 
// System.out.println(“姓名是:”+name+”年龄是:”+age); 


1.2向下转型 
向下转型 —将父类的对象赋值给子类的引用; 
前提是:首先进行向上转型(将一个对象向上转型为Person) 
Student s1 = new Student(); 
Person p = s1;//将子类的对象赋值给父类的引用; 
Student s2 = (Student)p;//将Person类型向下转型为Student类型; 
 
错误的向下转型: 
Person p = new Person(); 
Student s = (student)p; 
正确的向下转型: 
Person p = new Student(); 
Student s = (student)p; 
二.抽象类和抽象函数 
2.1什么是抽象函数? 
顾名思义就是:只有函数的定义,没有函数体的函数。 
abstract void fun();//无函数体 
函数定义(返回值,参数列表,函数名) 
在一个类中,如果一个类中拥有一个或者一个以上的抽象函数,那么这个类也必须被定义为抽象类。 
public abstract class Worker { 
String name; 
int age ; 
void introduce(){ 
System.out.println(“名字是:”+name+”年龄是:”+age); 

abstract void eat(); 

2.2什么是抽象类? 
顾名思义就是:使用abstract定义的类被称之为抽象类。 
需注意以下几点: 
a.抽象类不能够生成对象;(抽象类自身不能产生对象,而抽象类的子类可以生成对象) 
b.如果一个类中包含有抽象函数,那么这个类也必须被声明为抽象类;(若子类在继承过程中,父类中有抽系那个函数,则子类也应声明为抽象类) 
c.如果一个类中没有抽象函数,那么这个类也可以被声明为抽象类; 
2.3抽象类是否可以有构造函数? 
需满足这两个条件:抽象类不能生成对象;构造函数用于生成类的对象。 
实质上抽象类可以有构造函数,在生成子类对象的时候被调用。 
a.抽象函数就是没有函数体的函数; 
b.抽象类使用abstract来定义; 
c.抽象类不能生成对象,但是确可以拥有构造函数; 
三包的访问权限 
3.1包的作用: 
<1>把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用; 
<2>如同文件夹一样,包也采用了树形目录 的存储方式。同一个包中的类名是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。 
<3>包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。 
/
将类放置到一个包中,需要使用package”包名” 
编译时需要使用-d 参数,该参数的作用是依照包名生成相应的文件夹 
一个类的全名应该是”包名”+.”类名” 
/mars.Test 
包名的命名规范; 
1.要求包名所有的字母都要小写; 
2.包名一般情况下,是你的域名倒过来写 
marsdroid.org,package org.marsdriod 
凡是多了一个.相当于多了一个目录 

package org.marsdrioid.user; 
public class Person1 { 
public static void main(String[] args) { 
System.out.println(“打包”); 


3.2包的访问权限 
public:公有权限,可以修饰类,成员变量,成员函数,适用于跨包的场合中。(若类名被声明为public类型,则要求类名和原文件名需要一致),其代码如下: 
//如果类名被声明为public,则要求类名和原文件名需要一致 
package org.marsdroid; 
class Person{ 
public String name; 
public int age; 
public void introduce(){ 
System.out.println(name); 


package org.marsdroid; 
import org.marsdroid.Person;//也可以添加通用符.
 
class Test{ 
public static void main(String args[]){ 
/Person p = null;
org.marsdroid.Person p = new org.marsdroid.Person();//由于Person和Test不在一个包名中,所以在Person时必须是”包名”+”类名 ” 
//p.name = “zhangsan”在一个包的外部想要调用一个成员变量和成员函数,要求这个变量和函数都是public权限。 
p.age = 10;//若在同一个包中,包名可以省略; 


private:私有权限,修饰成员变量和成员函数;只能在本类中使用(前提是将成员变量和成员函数声明为private),在其他包中不能使用。 
package org.marsdroid; 
class Person{ 
private String name; 
private int age; 
private void introduce(){ 
System.out.println(name); 


package org.marsdroid; 
class Test{ 
public static void main(String args[]){ 
Person p = new Person(); 
//p.name = “Rose”;//因为name成员变量的访问权限为私有的,即使两个类在同一个包中,也不可以访问; 


default:包级别的访问权限。(不写权限修饰符,就是default权限),可以修饰类,成员变量和成员函数。作用域是声明的包范围,不能跨包调用。 
protected:受保护的权限,其权限允许在本类,或者是同包中的其他类或者是子类。 
3.3访问权限的继承 
package com.marsdroid; 
//package org.marsdroid; 
public class Person{ 
protected String name; 
protected int age; 
void eat(){ 
System.out.println(“吃饭”); 

void sleep(){ 
System.out.println(“睡觉”); 


package org.marsdroid; 
import com.marsdroid.Person; 
class Student extends Person{ 
void introduce(){ 
System.out.println(“我的名字是” + name +”我的年龄是” + age); 
}


class Test{ 
public static void main(String args[])}{ 
Student student = new student(); 
student.name = “lisa”; 
student.age = 18; 
student.introduce();//student继承了父类的一些成员变量和成员函数,减少了重复代码,因为如果不利用继承的关系,在student这个类中会出现重复代码; 


简单总结一下访问权限: 
要在一个包中使用另外一个包中的类,需要进行导入; 
如果一个类不是公共的,那么在这个类所在的包的外部使用这个类,要想在另外一个包中继承Person,那么Person必须是public类型的; 
如果子类和父类不在同一个包中,子类可以继承父类当中的default权限的成员变量和成员函数,但是由于权限不够,无法使用。使用default权限内容的前提是两个类必须在同一个包中; 
protected权限首先拥有default一样的功能,但是该权限只能修饰成员变量和成员函数,允许跨包的继承。即使子类和父类不在同一个包中 ; 
子类和父类不在同一个包中,子类可以调用父类中Protected权限的成员变量和成员函数; 
如果两个类没有关系,此时不同包只能访问类中的public类型的变量。 
访问权限的大小:public >protected>default>private 
public :即使两个类不在一个包中 ,没有关系,仍然可以访问; 
protected权限允许子类和父类在不同的包中,子类可以使用父类中的protected权限的成员变量和成员函数; 
default 允许在同一个包中访问; 
private只能在本类中使用; 
一个类的权限尽量小,这样才能体现出面向对象的封装性;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值