您的位置:首页 > 编程语言 > Java开发

JAVA面向对象详解

2017-11-09 20:13 169 查看
面向对象的三大特征:

1、 封装:

1)类本身是对属性和方法的封装

class Student

{

  int id;

  String name;

  int age;

  public static void main(String[] args)

  {

Student s = new Student();

s.id = 1;

s.name = “Tom”;

s.age = 12;

System.out.print(s.name+” ”+s.age);

}

}

-----------另一种写法(常用):

class Student

{

  int id;

  String name;

  int age;

}

class Test

{

public static void main(String[] args)

  {

Student s = new Student();

s.id = 1;

s.name = “Tom”;

s.age = 12;

System.out.print(s.name+” ”+s.age);

}

}

总结:main方法可以看作是单独的成员,不属于任何一个类,它只是一个程序的入口,放在哪个类里都一样,使用当前类的时候忽略它即可。以上两种写法都能实现一样的功能。

 

 

问题:名字或者年龄赋值的时候,有一定的限制,年龄不能超过200,名字得是合法字符。

2)需要对属性有一个访问权限的设置。

class Student

{

  int id;

  String name;

  int age;

}

------实现属性的封装:1、设置为私有不能直接访问;2、为每个私有成员配2个经纪人(set,get方法)

    set 负责间接赋值,get负责间接取值。

class Student

{

private int id;

//私有意味着不能用对象名.的方法来访问,比如不能Student s = new Student(); s.id = 1;

  public void setId(int  id)

{

     this.id = id;

}

public int  getId()

{

   return this.id;

}

  private String name;

public void setName(String  name)

{

     this.name = name;

}

public String  getName()

{

   return this.name;

}

  private int age;

public void setAge(int  age)

{

     this.age = age;

}

public int  getAge()

{

   return this.age;

}

}

public class Test {

public static void main(String[] args) {

Student s = new Student();

s.setAge(12);

s.setId(1);

s.setName("Tom");

System.out.println(s.getName()+"的年龄是:"+s.getAge());

}

}

 

 

注意:一般情况下set,get方法代码内容没有逻辑处理,但是有时会需要,比如改写一个set方法:

public void setAge(int age)

{

if(age<=200)  this.age = age;

else   this.age=18;

}

2、 继承:

public class Father {

 

 public void sayhello()

 {

 System.out.println("hello!!");

 }

 public void showInfo()

 {

 System.out.println("i am a father!");

 }

}

public class Sonextends Father{

 public void showInfo()

 {

 System.out.println("i am a son!");

 }

}

public class Test {

public static void main(String[] args) {

Son s = new Son();

s.sayhello();

s.showInfo();

}

}

 

 

 

总结:构建有直接父类的子类对象时,先在堆中构建父类对象,然后再构建子类对象,并且在子类对象的super变量中存放该父类对象的地址。

当调用方法或者属性时,先从子类对象中找,找到则直接运行,如果没有找到则去父类对象中找到再执行。

3、 多态:

最常见的场景就是 父类引用可以指向子类对象。

父类可以有多个子类,一个父类引用的变量可以存任何一个子类的对象,调用子类方法。从而实现多态。

改写Son类,在里面加一个新方法:

public class Sonextends Father{

 public void showInfo()

 {

 System.out.println("i am a son!");

 }

 public void<
4000
/span>
 study()

 {

 System.out.println("i am a student!");

 }

}

public class Test {

public static void main(String[] args) {

Son s = new Son();

s.showInfo();

s.study();

Father f = new Son();

//double d = 1;
大类型存小数据

f.showInfo();

//父类引用指向子类对象时 ,只能访问到从父类这里继承过去或者重新的方法,子类的新方法无法调用

}

}

 

 

4、 问题:

1)父类中的有些方法注定是要被重写的,它的方法体并没有意义,可以用没有方法体的方法来代替。

没有方法体的方法是抽象方法。

2)父类只能有一个,功能太单一。(java是单继承的)

 

解决方法:

用接口代替父类。(接口变相地实现了多继承)

接口的关键字是interface,里面全是没有方法体的抽象方法,想实现它的类,需要重写里面的方法。

interface  ICook

{

  void cook(); //没有方法体,默认是public的

}

interface  Ilawyer

{

  void law();

}

public class Personextends Father
implements ICook, Ilawyer

{

  public void law() {

System.out.println("i am a lawyer");

  }

  public void cook() {

System.out.println("i am a cooker");

  }

}

public class Test {

 public static void main(String[] args) {

   Person p = new Person();

   p.sayhello();//继承自父类

   p.cook();//实现了ICook接口

   p.law();//实现了Ilawyer接口

  

   //根据多态的原理:父类或者接口变量可以存子类或者实现类的对象

   Father f = new Person();

   ICook c = new Person();

   c.cook(); //只能访问到从自己这里继承或者实现的方法,其他的看不到

   Ilawyer w = new Person();

       w.law();

}

}

 

 

 

 

 

 

 

 

[小例子]

表名:Student

学号

姓名

年龄

1

Tom

12

2

Jerry

13

 

要求:

1、 单独写一个类,里面有一个方法,把上面的表格存入一个集合并返回。

2、 再写一个测试类,在main方法中,构建上面类的对象,并接受返回的集合,然后把集合数据显示出来。

 

第一个类:实体类

public class Student {

private int id;

private String
name;

private int age;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

if(age<=200)

this.age = age;

else this.age=18;

}

}

第二个类:

public class StuManager {

public List<Student> getStudents()

{

List<Student> stus = new ArrayList<Student>();

Student tom = new Student();

tom.setId(1);

tom.setName("Tom");

tom.setAge(12);

Student jerry = new Student();

jerry.setId(2);

jerry.setName("Jerry");

jerry.setAge(13);

stus.add(tom);

stus.add(jerry);

return stus;

}

 

}

第三个类:

public class Test {

public static void main(String[] args) {

  StuManager sm = new StuManager();

  List<Student> sts =  sm.getStudents();

  

  for (int i = 0; i < sts.size(); i++) {

System.out.println(sts.get(i).getId() +"  "+sts.get(i).getName()+"  "+sts.get(i).getAge());

  }

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: