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、 单独写一个类,里面有一个方法,把上面的表格存入一个集合并返回。
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());
}
}
}
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());
}
}
}
相关文章推荐
- java面向对象之main方法详解
- Java的面向对象说明,以及类和对象的详解
- java面向对象详解
- Java学习系列(二十一)Java面向对象之注解详解
- JAVA面向对象特征详解
- Java面向对象之抽象类、接口、内部类、枚举类详解
- JAVA基础初探(三)面向对象思想、类与对象、成员变量与局部变量、构造方法、static关键字详解
- Java语言面向对象特性详解
- Java学习系列(七)Java面向对象之集合框架详解(上)
- 2.java面向对象类与类/类与对象之间关系详解
- java面向对象中四种权限(private,protected,public,友好型)详解
- Java学习系列(六)Java面向对象之Jar命令、正则表达式、国际化详解
- Java学习系列(七)Java面向对象之集合框架详解(上)
- Java学习系列(九)Java面向对象之异常机制详解
- Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解
- Java学习系列(二十二)Java面向对象之枚举详解
- Java学习系列(六)Java面向对象之Jar命令、正则表达式、国际化详解
- 【Java工程师之路】[1-2.3]Java面向对象详解2
- Java学习系列(九)Java面向对象之异常机制详解
- Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解